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

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

3

Решение

Для дат:

Для временных отметок лучше всего использовать аннотацию @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);
}
}
}
}

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

2

Другие решения

На самом деле это неправильно.

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

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

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector