欢迎任何想法/反馈:)
我遇到了如何在一个大型Symfony2应用程序中处理我的Doctrine2实体的业务逻辑的问题.(抱歉帖子长度)
在阅读了许多博客,食谱和其他资源后,我发现:
好吧,我完全同意它,但是: 在哪里以及如何处理域模型上复杂的业务规则?
我们的域名模型:
- 一个组可以使用角色
- a 角色可以由不同的组使用
- 一个用户可以属于多个组与许多角色,
在SQL持久层中,我们可以将这些关系建模为:

我们的具体业务规则:
- 仅当角色附加到组时,用户才能在组中拥有角色.
- 如果我们从组G1中分离角色R1,则必须删除具有组G1和角色R1的所有UserRoleAffectation
这是一个非常简单的例子,但我想知道管理这些业务规则的最佳方法.
1-服务层实现
使用特定的Service类:
class GroupRoleAffectionService {
function linkRoleToGroup ($role, $group)
{
//...
}
function unlinkRoleToGroup ($role, $group)
{
//business logic to find all invalid UserRoleAffectation with these role and …Run Code Online (Sandbox Code Playgroud) 我需要部署同一个LAMP(或LEMP)应用程序的许多实例:
申请要求:
Nginx,MariaDB,PHPFPM)composer,bower,...)在阅读了Docker文档和许多howtos之后,我看到了对这个Web应用程序进行docker化的不同解决方案:
所有堆栈都在一个容器中:
mysql和webapp数据文件例子 :
Tutum 为Wordpress应用程序提供了一个多功能的容器:https://github.com/tutumcloud/tutum-docker-wordpressPhusion,提供针对Docker优化的基本映像,在文档中进行了精确处理(https://github.com/phusion/baseimage-docker#docker_single_process):
Docker可以在容器中运行多个进程.事实上,没有技术理由说明为什么要将自己限制在一个过程中
优点(恕我直言):
缺点(恕我直言):
对于要部署的每个webapp,部署了一个容器堆栈:
Nginx,Mysql,PHP-FPM,composer,, bower...)也可以进行docker化,或者在phpfpm容器中合并例子 :
Gaudi提供了一个基于3个"守护进程"容器(nginx,mysql,phpfpm)和2个app容器(作曲家,凉亭)的LEMP架构示例(http://marmelab.com/blog/2014/06/04 /demo-symfony-with-docker-and-gaudi.html)亲(恕我直言):
缺点(恕我直言): …
文档或我有问题.我做了文档所说的所有内容.
当我输入终端时:
$ php vendor/bin/doctrine orm:schema-tool:create
Run Code Online (Sandbox Code Playgroud)
输出是:
No Metadata Classes to process
Run Code Online (Sandbox Code Playgroud)
我读了许多帖子,并谷歌尝试了许多例子,但没有.
http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/tutorials/getting-started.html
我们的Docker图像发送封闭源,我们需要使用自己的私有docker注册表将它们存储在安全的地方.我们搜索使用简单身份验证层部署私有docker注册表的最简单方法.
我发现 :
shipyard/docker-private-registry基于stackbrew/registry的docker镜像,并通过Nginx添加基本身份验证 - https://github.com/shipyard/docker-private-registry我认为使用shipyard/docker-private-registry,但还有另一种最好的方法吗?
我想知道 :
按文件夹结构:
tests
|-- functional
|-- unit
Run Code Online (Sandbox Code Playgroud)
通过phpunit.xml中的config:
<testsuites>
<testsuite name="unit">...</testsuite>
<testsuite name="functional">...</testsuite>
</testsuites>
Run Code Online (Sandbox Code Playgroud)
通过注释
/**
* @group unit
*/
function testMyUnit()
Run Code Online (Sandbox Code Playgroud)
这是一个合理的方法吗?有没有标准的方法来做到这一点?什么"级别"分开(单元>集成>功能)?如果我想手动和最快地使用这些测试,并在Jenkins获得合理的覆盖率报告,如何利用它?
我正在尝试在具有大量业务逻辑的项目上有效地使用DDD和Doctrine2。
这对我来说是很新的,我正在阅读许多文章和代码示例,以了解DDD的主要原理和实践。
我知道我们需要将域对象与与系统相关的其他概念分离,即在分层体系结构中,“域层”必须与其他层隔离,例如持久层/服务(Doctrine2对我来说)。
但是有一件事对我来说很难理解:在带有doctrine2的ddd的几个代码示例中,域实体中的聚合是使用Doctrine ArrayCollection管理的,我发现了这种代码:
namespace Acme\Domain\Model\Users;
use Doctrine\Common\Collections\ArrayCollection;
class User{
//...
/**
* Collection of Roles
*
* @var Collection of Roles
*/
protected $roles;
/**
* Constructor.
*/
public function __construct()
{
$this->createdAt = new \DateTime();
$this->roles = new ArrayCollection();
}
public function getRoles()
{
return $this->roles;
}
//...
}
Run Code Online (Sandbox Code Playgroud)
对我而言,此实现在域模型和持久性服务 Doctrine2 之间建立了高度的耦合。
另一方面,如果我认为DDD实体和Doctrine实体类是分离的,那么层/类将很多。你怎么看 ?有更好的方法来避免/处理此问题吗?
想象一下,我们有familytree下面的模块(简单示例):
:- module(familytree, [
father/2,
mother/2,
%[...]
]).
father(X,Y) :- male(X),parent(X,Y).
father(unknown, _) :- male(unknown).
mother(X,Y) :- female(X),parent(X,Y).
mother(unknown, _) :- female(unknown).
sister(X,Y) :- female(X),parent(Z,X),parent(Z,Y), X \= Y.
%[... other relation predicates ... ]
Run Code Online (Sandbox Code Playgroud)
我想使用不同"dbs"的这个模块谓词,例如:
:- module(familytree_xyz, []).
male(james).
male(fred).
male(mike).
female(betty).
female(sandra).
parent(james, fred).
parent(betty, fred).
Run Code Online (Sandbox Code Playgroud)
要么 :
:- module(familytree_simpson, []).
male(homer).
male(bart).
female(marge).
female(lisa).
parent(homer, bart).
%[...]
Run Code Online (Sandbox Code Playgroud)
我需要 :
现在,我试着玩term_expansion/2, …
doctrine-orm ×3
docker ×2
symfony ×2
domain-model ×1
go ×1
lamp ×1
module ×1
object ×1
php ×1
prolog ×1
tdd ×1
unit-testing ×1