gpt4 book ai didi

events - symfony 域事件

转载 作者:行者123 更新时间:2023-12-03 01:33:54 25 4
gpt4 key购买 nike

我正在尝试在我的 Symfony2 项目中实现领域驱动设计并遇到一些问题。在阅读了一些有关领域模型的文章后,我发现,

  • 我应该将所有业务逻辑放入我的域模型(实体)中。
  • 需要完成且不属于域逻辑的应用程序级别的内容由域事件触发(发送电子邮件、将一些消息放入队列等)

幸运的是,Symfony 提供了事件,但这里有一个问题 - 我无法从我的实体引发事件。Symfony 文档建议使用 DI 将调度程序注入(inject)到类中,从而引发事件

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

但是 Symfony 实体是可更新的,不可注入(inject)。现在我可以看到两种方法:

1) 像这样向实体提供事件调度程序

class FooEntity
{
protected $dispatcher = null;

public function setEventDispatcher(EventDispatcher $dispatcher)
{
$this->dispatcher = $dispatcher;
}
}

2) 从服务(而不是从实体)引发事件。

这些选项看起来都不漂亮,因为在我看来它们打破了领域模型意识形态。请您给我指出正确的方向。

最佳答案

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

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

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

我认为实体本身不应该拥有一切。无论如何,DDD 的人肯定不会这么说。 [Doctrine2] 实体应该只处理 relationships (一个 entity with different variation too <= 这实际上是我被困了一段时间的事情)和 aggregate root

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

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

存储库

是提供帮助程序来获得比快速 findBy(array('id'=>$idvalue)) 更复杂的查找器的东西(以及 Entity/Assocation/Annotation无法覆盖),确实是一个方便携带的好东西。

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

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

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

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

我发现了关于此事的信息金矿 on this blog,其中涵盖:

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

关于events - symfony 域事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8040592/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com