Symfony2: получить security.context внутри класса сущности

Можно ли получить security.context внутри класса сущности?

Я знаю, что следующее не работает. Я не знаю, как реализовать $user часть $user .

 /** * Set createdAt * * @ORM\PrePersist */ public function setCreatedAt() { $user = $this->get('security.context')->getToken()->getUser(); $this->owner = $user->getId(); $this->createdAt = new \DateTime(); $this->updatedAt = new \DateTime(); } 

Для времени:

Для временных меток вы, вероятно, лучше всего используете аннотацию @hasLifeCycleCallback и некоторые дополнительные методы, помеченные как @prePersist и @preUpdate. Для создания вы могли бы просто сделать это в самом __constructor.

Обратите внимание, что вы должны использовать @preUpdate для свойства $ updatedAt, @prePersist предназначен только для новых объектов.

Если у вас много объектов, которые в этом нуждаются, вы можете рассмотреть слушателя Doctrine2, чтобы предотвратить повторный код.

Для свойств собственности:

Если вы всегда хотите установить право собственности на объект на «текущего пользователя», вам, вероятно, лучше всего воспользоваться слушателем или подписчиком Doctrine2. Таким образом, вам не нужно добавлять эту логику к контроллеру или везде, где вам нужно создать объект.

http://symfony.com/doc/current/cookbook/doctrine/event_listeners_subscribers.html http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/events.html#onflush

Создайте службу-прослушиватель, как описано, убедитесь, что он получает контекст безопасности с помощью конструктора. Установите его в event onFlush, таким образом вы можете настроить объект непосредственно перед фактической экономией. Это лучшее событие для решения такого рода вещей.

Убедитесь, что вы следуете сноскам в главе onFlush в документации Doctrine, иначе изменение в последнюю минуту не будет воспринято Doctrine.

Ваш слушатель должен, вероятно, выглядеть примерно так:

 class FlushExampleListener { public function onFlush(OnFlushEventArgs $eventArgs) { $em = $eventArgs->getEntityManager(); $uow = $em->getUnitOfWork(); foreach ($uow->getScheduledEntityInsertions() as $entity) { if ($entity instanceof YourClass) { // change owner $entity->setOwner($this->securityContext->getToken()->getUser()); // tell doctrine you changed it $uow->recomputeSingleEntityChangeSet($em->getClassMetadata(get_class($entity)), $entity); } } foreach ($uow->getScheduledEntityUpdates() as $entity) { if ($entity instanceof YourClass) { // change owner $entity->setOwner($this->securityContext->getToken()->getUser()); // tell doctrine you changed it $uow->recomputeSingleEntityChangeSet($em->getClassMetadata(get_class($entity)), $entity); } } } } 

Обратите внимание, что это не проверяет, действительно ли пользователь зарегистрирован …

Действительно, это неправильно.

Держите его простым, вы хотите установить владельца своей сущности при ее создании? Передайте его конструктору объекта и установите его там.

Обратите внимание на то, что я бы рекомендовал использовать обратный вызов prePersist и preUpdate для обработки суточных временных меток. Этот lib (php 5.4+) предлагает очень простой набор инструментов для реализации таких функций: https://github.com/KnpLabs/DoctrineBehaviors