Можно ли получить security.context
внутри класса сущности?
Я знаю, что следующее не работает. Я не знаю, как реализовать $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
Создайте сервис-слушатель в соответствии с документацией, убедитесь, что он получает контекст безопасности, используя конструктор.
Установите его на событие 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 для обработки меток времени объекта. Эта библиотека (php 5.4+) предлагает очень простой набор инструментов для реализации таких функций: https://github.com/KnpLabs/DoctrineBehaviors