От Doctrine2 documentation:
postPersist - Событие postPersist происходит для объекта после того, как объект был достигнут упорным. Он будет вызываться после операций вставки базы данных. Сгенерированные значения первичного ключа доступны в событии postPersist.
Но мы должны принять во внимание, что Doctrine2 вызывает транзакцию неявно по умолчанию. В этом подходе транзакция заканчивается, когда вы используете flush() в вашем менеджере сущностей. Вот почему вы не можете видеть данные в своей базе данных, если вы не скрываете диспетчер объектов. EntityManager # flush() - это когда транзакция начинается и заканчивается. Тем не менее у нас также есть возможность вызывать транзакцию явно, но она также не позволит вам видеть данные в базе данных между началом транзакции, сохранением объекта и фиксацией транзакции.
Фактически вы не можете опускать транзакции в Doctrine2, поэтому вы не можете ожидать, что ваши данные будут видны сразу после продолжения действия при возникновении события PostPersist.
Для этого вам необходимо использовать событие PostFlush.
Postperist в моей реальной жизни опыт используется, например, для:
- Создание данных, зависящих от созданного объекта (т.е. автоматические переводы, автоматические даты, некоторые конкретные обновления отношений)
- отправить уведомления другие события
- отправить электронную почту
Я надеюсь, что это помогает.
EDIT
Взгляните на примеры onFlush
события, где вы можете увидеть примеры того, как пройти через единицу работы, чтобы добраться до вашего объекта. onFlush examples
работать только на конкретном объекте просто использовать:
if ($entity instanceof Product) {
// do something with the YourEntityName
}
Что имеет свою историю из сайтов социальных сетей общего с вопросом о том, почему вы должны использовать PostPersist? Используйте PostPersist для отправки почты пользователю после создания сущности, поэтому он основан на событии. Поэтому вам не нужно делать это после каждого флеша, внутри каждого контроллера, который создает для вас этот объект. – Kwido
Согласен, в случае, если это событие, происходящее при каждом сохранении данного объекта, рассмотрит возможность использования [пользовательского подписчика событий] (http://symfony.com/doc/current/doctrine/event_listeners_subscribers.html). Они более гибкие, чем любое событие обратного вызова. – ferdynator
@ Kwido Пример социальной сети - объяснить, что данные еще не вставлены в базу данных во время обратного вызова PostPersist. Но данные были вставлены в базу данных после вызова flush(). – user3502626