Вы, наверное, уже знаете о доктринальных событиях .Что вы можете сделать:
Использовать обработчик событий postPersist
.Это происходит после вставки БД, поэтому автоматически генерируемые идентификаторы доступны.
Класс EventManager
может помочь вам в этом:
class MyEventListener
{
public function postPersist(LifecycleEventArgs $eventArgs)
{
// in a listener you have the entity instance and the
// EntityManager available via the event arguments
$entity = $eventArgs->getEntity();
$em = $eventArgs->getEntityManager();
if ($entity instanceof User) {
// do some stuff
}
}
}
$eventManager = $em->getEventManager():
$eventManager->addEventListener(Events::postPersist, new MyEventListener());
Обязательно проверьте, например, *У 1012 * уже есть Image
, в противном случае, если вы вызовете flush в прослушивателе событий, вы можете оказаться в бесконечном цикле.
Конечно, вы также можете сообщить своему классу User
о создании этого образаработать со встроенным postPersist
eventHandler и добавлять @HasLifecycleCallbacks
в ваше отображение, а затем всегда сбрасывать в конце запроса, например, в функции завершения работы, но, на мой взгляд, этот вид вещей принадлежит отдельному слушателю.YMMV.
Если вам нужен идентификатор объекта перед сбросом, сразу после создания объекта, другой подход заключается в создании идентификаторов для объектов в вашем приложении, например, с использованием uuids .
Теперь вы можете сделать что-то вроде:
class Entity {
public function __construct()
{
$this->id = uuid_create();
}
}
Теперь у вас уже установлен идентификатор, когда вы просто делаете:
$e = new Entity();
И вам нужно всего лишь вызвать EntityManager :: flush наконец запроса