我的项目是一个用symfony 2.7构建的php项目
我有两个实体:Lead和Customer。 某些用户操作会创建Lead实体,管理员可以根据Lead创建Customer实体。 Lead和Customer实体都与实体Status具有一对多关系(Lead / Customer可以拥有状态)
到目前为止,潜在客户的状态独立于从其创建的客户的状态(反之亦然),但现在,我需要让它们保持同步。 他们必须是一样的。
我不想在控制器中这样做,因为状态可以通过多种方式改变,并且可能会添加新的方式。 所以我尝试使用doctrine PreUpdate事件监听器来做这件事,但由于某些原因,它只是不起作用(改变第一个事件中的另一个实体的PreUpdate事件会在第二个事件上触发PreUpdate - 这可能是杀了它。但我不确定。)
我会继续尝试修复PreUpdate事件监听器,除非这里有人有更好的想法吗?
谢谢: - )
use CRM\CoreBundle\Entity\Customer;
use Doctrine\ORM\Event\PreUpdateEventArgs;
class CustomerPreUpdateListener
{
public function preUpdate(PreUpdateEventArgs $args)
{
$entity = $args->getObject();
if (!($entity instanceof Customer)) {
return;
}
if($this->isStatusChanged($args)) {
$this->syncParentLeadStatus($args);
}
}
private function isStatusChanged(PreUpdateEventArgs $args)
{
return $args->hasChangedField('status');
}
private function syncParentLeadStatus(PreUpdateEventArgs $args)
{
/** @var Customer $entity */
$entity = $args->getObject();
if(!$entity->getLead()) {
return;
}
$newStatus = $args->getNewValue('status');
$entity->getLead()->setStatus($newStatus);
$args->getEntityManager()->persist($entity->getLead());
}
}
use CRM\BasicLeadsBundle\Entity\Lead;
use CRM\CoreBundle\Entity\Customer;
use Doctrine\ORM\Event\PreUpdateEventArgs;
class LeadPreUpdateListener
{
public function preUpdate(PreUpdateEventArgs $args)
{
$entity = $args->getObject();
if (!($entity instanceof Lead)) {
return;
}
if($this->isStatusChanged($args)) {
$this->syncCustomerStatus($args);
}
}
private function isStatusChanged(PreUpdateEventArgs $args)
{
return $args->hasChangedField('status');
}
private function syncCustomerStatus(PreUpdateEventArgs $args)
{
/** @var Lead $entity */
$entity = $args->getObject();
if(0 === $entity->getCustomersCreated()->count()) {
return;
}
$newStatus = $args->getNewValue('status');
foreach ($entity->getCustomersCreated() as $customer) {
/** @var Customer $customer */
$customer->setStatus($newStatus);
$args->getEntityManager()->persist($customer);
}
}
}