Reputation: 5092
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
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.
You can do this using an onFlush listener - it's a little more work, but will do what you're after.
Upvotes: 5