php - preUpdate Doctrine Listener 中的 Symfony 刷新

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

service.yml:

delivery_address.listener:
    class: FM\AppBundle\EventListener\DeliveryAddressListener
    tags:
        - { name: doctrine.event_listener, event: prePersist }
        - { name: doctrine.event_listener, event: preUpdate }

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

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

$args->getEntityManager()->persist($deliveryAdress);
$args->getEntityManager()->flush();

最佳答案

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

See documentation

您可以使用 onFlush listener 来执行此操作- 这需要更多的工作,但会做你想要的事情。

关于php - preUpdate Doctrine Listener 中的 Symfony 刷新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37817582/

相关文章:

javascript - map 未在我的 jquery 中显示

php - 如何将关联数组的 PHP 数组传输到 javascript?

PHPExcel PDF布局

php - 删除带有 FK 的行作为 PK + Symfony2 和 Doctrine

php - Symfony2 Doctrine 自定义查询问题

php - cakephp 无法使用 set 更新表

javascript - 我定义函数的错误在哪里?

php - 如何在 NelmioAlice 的实体构造函数中设置 ArrayCollection 的固定装置

php - 如何解决 "Circular reference detected for service"问题?

entity-framework - 具有实体替换的 Doctrine 2 模块化应用程序