【问题标题】:Domain Driven Design - Aggregates - EventPublisher with Doctrine领域驱动设计 - 聚合 - EventPublisher with Doctrine
【发布时间】:2015-08-07 22:06:35
【问题描述】:

我想问一下在聚合中使用 EventPublisher。

class SomeAggregate
{

    private $eventPublisher;

    public function __construct(EventPublisher $eventPublisher)
    {
        $this->eventPublisher = $eventPublisher;
    }


}   

当我创建 SomeAggregate 时,我将 EventPublisher 传递给构造函数,一切正常。

但是当我从数据库中检索这个对象时呢? Doctrine 根据表中的字段重建对象,将跳过 EventPublisher。

如何让 Doctrine 每次从数据库中检索 SomeAggregate 时都注入 EventPublisher?

如果存在,我的首选方法是将 $eventPublisher 属性映射到 EventPublisher 类。

【问题讨论】:

  • 基本上你不能。但是,看看这种方法:whitewashing.de/2013/07/24/doctrine_and_domainevents.html
  • 谢谢伙计。我不喜欢这种处理事件的方式,其中事件不是独立的类,而且我几乎不做教义,但稍加修改我就可以使用这种方法。首先,我将事件更改为一个类,其次我将事件数组作为属性保留在类中(与示例中完全相同)。接下来我将拥有从聚合和所有子实体返回事件的方法。因此,我将从域外收集这些事件并发布它们。

标签: php symfony doctrine-orm event-handling domain-driven-design


【解决方案1】:

带有 Doctrine 事件监听器

services:
    my.listener:
        class: AppBundle\EventListener\EventPublisherInjector
        arguments: [@event_publisher_service_id]
        tags:
            - { name: doctrine.event_listener, event: postLoad }

AppBundle\EventListener\EventPublisherInjector:

public function __construct(EventPublisher $eventPublisher)
{
    $this->eventPublisher = $eventPublisher;
}

public function postLoad(LifecycleEventArgs $args)
{
    $entity = $args->getEntity();
    if ($entity instanceof SomeAggregate) {
         $entity->setEventPublisher($this->eventPublisher);
    }
} 

http://symfony.com/doc/current/cookbook/doctrine/event_listeners_subscribers.html

http://doctrine-orm.readthedocs.org/en/latest/reference/events.html#postload

【讨论】:

  • 您的回答很好,但感谢@Cerad,我找到了更好的解决方案:)
猜你喜欢
  • 1970-01-01
  • 2010-11-01
  • 2013-09-16
  • 1970-01-01
  • 2019-06-27
  • 2011-04-26
  • 1970-01-01
相关资源
最近更新 更多