Можно ли получить 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