symfony域事件

mik*_*mik 6 events domain-driven-design symfony

我正在尝试在我的Symfony2项目中实现域驱动设计并遇到一些问题.在阅读了一些关于Domain Models的文章后,我发现了

  • 我应该将所有业务逻辑放入我的域模型(实体)中.
  • 需要完成并且不属于域逻辑的应用程序级别的东西是通过域事件(发送电子邮件,将一些消息放入队列等)触发的.

幸运的是,Symfony提供了活动,但这是一个问题 - 我不能从我的实体提出事件.Symfony文档建议使用DI将调度程序注入类中,从而引发Event

http://symfony.com/doc/current/book/internals.html#passing-along-the-event-dispatcher-object

但Symfony实体是新的,不可注射.现在我可以看到两种方式:

1)向这样的实体提供事件Dispather

class FooEntity
{
    protected $dispatcher = null;

    public function setEventDispatcher(EventDispatcher $dispatcher)
    {
        $this->dispatcher = $dispatcher;
    }
}
Run Code Online (Sandbox Code Playgroud)

2)从服务(而不是实体)提升事件.

这些选项看起来都不是很漂亮,因为在我看来他们打破了域模型的意识形态.请你指点我正确的方向.

ren*_*irb 2

这里的想法是提供实现 DDD 范式的路径。

我不想掩盖@magnusnordlander 的答案,我会应用他所说的。

以下是对此事的一些观察:

我认为实体本身不应该拥有一切。无论如何,DDD 的人肯定不会这么说。[Doctrine2] 实体应该只处理关系有不同变体的实体<= 这实际上是我被困了一段时间的事情)和聚合根

教义实体应该只知道如何与自己合作。

但是,要获取数据或使用数据,您还可以使用其他东西:

存储库

它可以为您提供比快速查找器更复杂的查找器findBy(array('id'=>$idvalue))(并且实体/关联/注释无法涵盖),并且确实是一个方便使用的好东西。

我个人尝试构建所有查询,并意识到 EntityManager 已经非常好,开箱即用。 在大多数情况下,我认为:如果您可以/不/使用查询或查询生成器,那就更好了。

所有这些中的业务逻辑...

最后要注意的是,您要寻找的必须是从根本上精简控制器。

FooManager(例如)是业务逻辑所在的地方(如果我没记错的话)。

我在这个博客上发现了有关此事的信息金矿,其中包括:

如果您有任何想法,为了补充,我将此答案设置为社区 Wiki