Бесконечный цикл при сохранении сущности с помощью прослушивателей событий - PullRequest
0 голосов
/ 30 декабря 2011

Я использую Symfony 2 с Doctrine 2. У меня есть UserListener ( страница документации Symfony ), которая прослушивает события PrePersist & PreRemove для объектов User.Сохраняя пользователя, я хочу создать экземпляр UserInventory для User.UserInventory является владельцем (однонаправленной) ассоциации.

Однако при этой настройке я сталкиваюсь с бесконечным циклом:

class UserListener {

    /**
     * Initializes UserInventory for user with initial number of nets
     */
    public function prePersist(LifecycleEventArgs $args) {
        $em = $args->getEntityManager();
        $user = $args->getEntity();
        $inventory = new UserInventory();
        $inventory->setUser($user);
        $inventory->setNumNets($this->initialNets);
        $em->persist($inventory); // if I comment out this line, it works but the inventory is not persisted
        $em->flush();
    }

}

Может случиться так, что UserInventory является собственником ассоциации, таким образом, он пытается снова сохранить пользователя, что приводит кв этой функции вызывается снова?Как я могу это исправить?

Я хочу, чтобы мой UserInventory владел ассоциацией здесь, потому что она в "правильном" комплекте.У меня есть UserBundle, но я не думаю, что там должен быть класс Inventory.

ОБНОВЛЕНИЕ : Ошибка / Журнал

1 Ответ

1 голос
/ 30 декабря 2011

Вы добавили слушателя для всех энтитов в вашем приложении.Конечно, когда вы сохраняете какой-либо объект, например, UserInventory, prePersist будет вызываться снова и снова.Как сказано в документации Symfony, вы можете просто проверить:

    if ($user instanceof User) {
        $inventory = new UserInventory();
        $inventory->setUser($user);
        $inventory->setNumNets($this->initialNets);
        $em->persist($inventory);
    }

Кроме того, я рекомендую прочитать о событиях в доктрине2.

...