如何在两个实体之间同步值

时间:2017-07-27 07:01:47

标签: php symfony symfony-2.7

我的项目是一个用symfony 2.7构建的php项目

我有两个实体:Lead和Customer。 某些用户操作会创建Lead实体,管理员可以根据Lead创建Customer实体。 Lead和Customer实体都与实体Status具有一对多关系(Lead / Customer可以拥有状态)

到目前为止,潜在客户的状态独立于从其创建的客户的状态(反之亦然),但现在,我需要让它们保持同步。 他们必须是一样的。

我不想在控制器中这样做,因为状态可以通过多种方式改变,并且可能会添加新的方式。 所以我尝试使用doctrine PreUpdate事件监听器来做这件事,但由于某些原因,它只是不起作用(改变第一个事件中的另一个实体的PreUpdate事件会在第二个事件上触发PreUpdate - 这可能是杀了它。但我不确定。)

我会继续尝试修复PreUpdate事件监听器,除非这里有人有更好的想法吗?

谢谢: - )

Customer 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());
    }
}

Lead PreUpdate侦听器

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);
        }
    }
}

0 个答案:

没有答案