原则2-使用事件侦听器进行实体状态更改是否错误?

时间:2018-11-18 18:05:21

标签: php design-patterns doctrine

有关设计模式的问题。

我在一个项目中使用doctrine2,该项目具有一个具有状态的实体,我们称其为“ entityWithStatus”。当该实体更改其状态时,我希望其他对象能够侦听该更改,在这种情况下,请创建新的logPost。我读了关于事件侦听器的documentation,感觉就像是我需要的东西,但是,当我想在侦听器中保留一个新实体时,它不起作用。侦听器代码运行,但是数据未持久保存在实体中,即使已设置所有数据,错误消息也会显示“未绑定任何参数”。我通过告诉工作单元已进行更改来添加“ hacky”解决方案。我在堆栈溢出中已阅读了具有类似问题的线程,但是没有一个问题可以解决这个问题。我看着Marco Pivetta talk about best pratices in Doctrine,他说“避免生命周期回调”,这确实使我感到困惑。我看到事件侦听器以发布/订阅模式进行订阅,但是也许我错了?

我的问题是,我缺少什么吗?这个逻辑应该在另一层吗?我们在此项目中使用存储库/服务模式。也许我应该在存储库中添加订阅者,然后添加一个“ setStatus()”方法,该方法在调用时触发订阅者?

示例代码:

/**
 * @Entity
 * @EntityListeners({"myEventListener"})
 * @Table(name="entityWithStatus")
 * @HasLifecycleCallbacks
 */
class entityWithStatus {
    /** @Id
     *  @Column(type="integer")
     *  @GeneratedValue
     *  @var int
     **/
    public $id;

    /**
     * @Column(type="integer", length=11)
     * @var int
     **/
    public $status;
}

logPost实体示例。

/**
 * @Entity
 * @Table(name="logPosts")
 */
class logPost {
    // logPost entity
}

每次“ entityWithStatus”更改状态时,事件侦听器都会创建一个新的日志帖子。

class myEventListener {
    public function preFlush(entityWithStatus $entityWithStatus, PreFlushEventArgs $event) {
        $log = new logPost();
        $log->setText('Status changed: ' . $entityWithStatus->getStatus());
        $entityManager = $event->getEntityManager();
        $entityManager->persist($log);

        // Hacky solution to tell unit of work about the changes
        $metaData = $entityManager->getClassMetadata('logPost');
        $entityManager->getUnitOfWork()->computeChangeSet($metaData, $trustcruitModel);
    }
}

0 个答案:

没有答案