preUpdate Doctrine Listener 中的 Symfony 刷新

Kev*_*vin 2 php symfony doctrine-orm

嗨,我有一个 prePersist 和 preUpdate 侦听器:

<?php

namespace FM\AppBundle\EventListener;

use Doctrine\ORM\Event\LifecycleEventArgs;
use FM\AdminBundle\Entity\Address\DeliveryAddress;

class DeliveryAddressListener
{

    /**
     * @param LifecycleEventArgs $args
     */
    public function prePersist(LifecycleEventArgs $args)
    {
        $entity = $args->getEntity();

        if(!$entity instanceof DeliveryAddress){
            return;
        }

        $this->addNameToUser($args);
        $this->addPostalToUser($args);
    }

    /**
     * @param LifecycleEventArgs $args
     */
    public function preUpdate(LifecycleEventArgs $args)
    {
        $entity = $args->getEntity();

        if(!$entity instanceof DeliveryAddress){
            return;
        }

        $this->addPostalToUser($args);
    }

    /**
     * @param LifecycleEventArgs $args
     */
    public function addNameToUser(LifecycleEventArgs $args)
    {
        /** @var DeliveryAddress $deliveryAdress */
        $deliveryAdress = $args->getEntity();
        $user = $deliveryAdress->getOwner();

        if(empty($user->getFirstName())) $user->setFirstName($deliveryAdress->getFirstName());
        if(empty($user->getLastName())) $user->setLastName($deliveryAdress->getLastName());
    }

    /**
     * @param LifecycleEventArgs $args
     */
    public function addPostalToUser(LifecycleEventArgs $args)
    {
        /** @var DeliveryAddress $deliveryAdress */
        $deliveryAdress = $args->getEntity();
        $user = $deliveryAdress->getOwner();
        $user->setPostalCode($deliveryAdress->getZipCode());
    }
}
Run Code Online (Sandbox Code Playgroud)

服务.yml:

delivery_address.listener:
    class: FM\AppBundle\EventListener\DeliveryAddressListener
    tags:
        - { name: doctrine.event_listener, event: prePersist }
        - { name: doctrine.event_listener, event: preUpdate }
Run Code Online (Sandbox Code Playgroud)

prePersist 工作正常。但 preUpdate 不会保留任何内容。

当我在addPostalToUser()函数中添加以下代码时,我的 nginx 服务器崩溃了:

$args->getEntityManager()->persist($deliveryAdress);
$args->getEntityManager()->flush();
Run Code Online (Sandbox Code Playgroud)

Ric*_*ard 5

您的问题是,在此事件中不允许更改已更新实体的关联。因此更改 DeliveryAddress 上的用户关联将不起作用。

查看文档

您可以使用onFlush 监听器来完成此操作- 这需要更多的工作,但会做您想要的事情。