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/

相关文章:

php - 将数量输入字段更改为 WooCommerce 中的下拉列表

php - 检测到服务 "session"的循环引用,路径 : "session -> session.flash_bag -> session"

php - 如何在doctrine2(独立)中创建数据库

MySQL NOW() 在 Doctrine DBAL 插入中?

php - OO PHP 从另一个类访问公共(public)变量

php - $_SERVER 和 $_ENV 之间的区别

php - Flesch-Kincaid 可读性 : Improve PHP function

symfony - 检查 prod env 中的学说设置

symfony - 在 Symfony2 中访问关联实体的值的最佳实践是什么?

php - 如何检查 Doctrine 2 中的实体是否更改?