Kevin
Kevin

Reputation: 5092

Symfony flush in preUpdate Doctrine Listener

Hi I have an prePersist and preUpdate listener:

<?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 }

The prePersist works fine. But the preUpdate does not persist anything.

And when I add this code bellow in my addPostalToUser() function, my nginx server crash :

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

Upvotes: 2

Views: 8600

Answers (1)

Richard
Richard

Reputation: 4129

Your problem is that changes to associations of the updated entity are not allowed in this event. So changing the user association on DeliveryAddress will not work.

See documentation

You can do this using an onFlush listener - it's a little more work, but will do what you're after.

Upvotes: 5

Related Questions