2013-07-23 3 views
-1

У меня есть небольшая проблема с PreUpdate LifecycleCallbacks в Symfony.PreUpdate entity symfony LifecycleCallbacks

У меня есть объект Пользователь с отношением OneToMany с продуктом сущности.

class User{ 
    /** 
    * @ORM\OneToMany(targetEntity="Product", mappedBy="formulario", cascade={"persist", "remove"}) 
    */ 
    private $products; 
} 

class Product{ 
    /** 
    * @ORM\ManyToOne(targetEntity="User", inversedBy="products") 
    * @ORM\JoinColumn(name="user", referencedColumnName="id") 
    */ 
    private $user; 
} 

Проблема возникает, когда я добавляю или удаляю продукт у Пользователя. Когда это происходит, я хочу запустить функцию PreUpdate, чтобы внести некоторые изменения в User Entity. Но PreUpdate не является огнем при изменении объекта Product от пользователя.

Большое спасибо !!!

+1

$ Produt на объект пользователя является обратная сторона ассоциации, я не уверен, любой обратный вызов жизненного цикла будет вызван для пользователя, когда Продукт (сторона владельца) будет изменен. Вы можете попробовать поставить обратный вызов на объект продукта – Florent

+0

Хорошо! Это работает! Благодаря! Но есть ли способ поставить PreUpdate в User Entity? В некотором роде Пользователь меняет добавление продукта ... Для меня это намного проще и организован, чтобы увидеть функцию в объекте User. По-вашему, мне нужно вызвать функцию пользователя из объекта продукта PreUpdate {$ this-> getUser() -> PreUpdateUser()}. Поэтому у меня должно быть две функции: PreUpdate для пользователя и PreUpdate для продукта (который вызывает пользователя PreUpdate) В любом случае, большое спасибо! – Angel

+0

Кроме того, также запускается событие PreRemove, но оно не вносит изменений. Итак, если я удаляю продукт, функция PreRemove запускается, но код $ this-> getUser() -> setSomeField() не действует, поэтому Продукт удаляется из БД, но Пользователь не меняет :(Это потому, что я удаляю объект Product, так что изменения в FK пользователя теряются? – Angel

ответ

2

Изменение связанных объектов не допускается с использованием прослушивателя preUpdate.

Изменение ассоциаций обновленного лица никогда не допускается в этом событии, так как доктрина не может гарантировать, чтобы правильно обрабатывать ссылочной целостности в этой точке промывочной операции.

... с documentation.

0

У меня такая же проблема, и я решил его обновление $ пользователя в preUpdate() затем запланировать дополнительное обновление:

$args->getEntityManager()->getUnitOfWork()->scheduleExtraUpdate($user, array(
     'field_name' => array($oldValue, $newValue) 
    )); 
+0

Этот метод отмечен как INTERNAL, поэтому его небезопасно использовать. – felipsmartins