小编Kor*_*nik的帖子

Symfony应用程序中的Doctrine实体和业务逻辑

欢迎任何想法/反馈:)

我遇到了如何在一个大型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)

php domain-driven-design symfony doctrine-orm

56
推荐指数
2
解决办法
1万
查看次数

Docker:如何Dockerize和部署LAMP应用程序的多个实例

我需要部署同一个LAMP(或LEMP)应用程序的许多实例:

  • 每个实例都可以通过前置loadbalancer/proxy从子域访问
  • 每个实例都必须有自己的db数据和文件数据.
  • 每个实例都可能受到监控
  • 每个应用程序实例可能设置内存限制/ CPU
  • 易于自动部署新的webapp实例
  • 环境可能很容易重现,可用于测试和开发.

申请要求:

  • dameon过程(Nginx,MariaDB,PHPFPM)
  • 二进制文件(composer,bower,...)
  • 其他系统特定的库和配置

在阅读了Docker文档和许多howtos之后,我看到了对这个Web应用程序进行docker化的不同解决方案:


解决方案1:使用一体化容器

所有堆栈都在一个容器中:

  • webapp源文件,EMP守护程序进程,二进制文件,...
  • 已安装的卷mysql和webapp数据文件

例子 :

优点(恕我直言):

  • 似乎很容易实现自动化,监控,摧毁.......
  • 易于在prod,test和dev环境中使用.

缺点(恕我直言):

  • 单片
  • 难以扩展
  • 不使用Docker的所有优势

解决方案2:每个webapp实例使用容器堆栈

对于要部署的每个webapp,部署了一个容器堆栈:

  • 每个进程的一个容器:Nginx,Mysql,PHP-FPM,
  • 二进制容器(composer,, bower...)也可以进行docker化,或者在phpfpm容器中合并
  • 装载mysql和webapp数据文件的卷

例子 :

(恕我直言):

  • 解耦
  • 每个实例隔离的进程
  • 每个容器一个进程,不需要守护程序管理器作为RUnit或Supervisord

缺点(恕我直言): …

lamp web-applications web-deployment docker

50
推荐指数
2
解决办法
2万
查看次数

如何在golang中转换ISO 8601时间?

golang中以下shell命令的等效代码是什么? date -u +%Y-%m-%dT%T%z

go

46
推荐指数
5
解决办法
3万
查看次数

Doctrine2 - 无需处理的元数据类

文档或我有问题.我做了文档所说的所有内容.

当我输入终端时:

$ 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

doctrine-orm

38
推荐指数
3
解决办法
3万
查看次数

Docker:保护私有注册表的最简单方法是什么?

我们的Docker图像发送封闭源,我们需要使用自己的私有docker注册表将它们存储在安全的地方.我们搜索使用简单身份验证层部署私有docker注册表的最简单方法.

我发现 :

我认为使用shipyard/docker-private-registry,但还有另一种最好的方法吗?

authentication docker

34
推荐指数
2
解决办法
2万
查看次数

如何在Symfony2中分离单元和功能测试?

我想知道 :

  1. 如果在Symfony2中分离测试(Unit | Functional ...)是个好主意,
  2. 以及我应该如何分开:

按文件夹结构:

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获得合理的覆盖率报告,如何利用它?

tdd unit-testing symfony

9
推荐指数
1
解决办法
1114
查看次数

DDD,Doctrine2,Aggregates和ArrayCollection:如何隔离域模型?

我正在尝试在具有大量业务逻辑的项目上有效地使用DDDDoctrine2

这对我来说是很新的,我正在阅读许多文章和代码示例,以了解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实体类是分离的,那么层/类将很多。你怎么看 ?有更好的方法来避免/处理此问题吗?

domain-driven-design domain-model doctrine-orm

5
推荐指数
1
解决办法
1848
查看次数

Prolog Design Pattern扩展模块谓词

想象一下,我们有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)

我需要 :

  • 运行时选择db ,而不是在编译选择db .
  • 在同一时间使用一个或多个dbs.
  • 扩展数据库,例如.创建一个"familytree_simpson_extended"db模块,其他Simpson家族成员扩展"familytree_simpson"db模块(参见上面的例子)
  • SWI-Prolog的标准.

现在,我试着玩term_expansion/2, …

design-patterns module object prolog

5
推荐指数
0
解决办法
706
查看次数