有关设计模式的问题。
我在一个项目中使用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);
}
}