Symfony подключает идентификатор пользователя от объекта

В приложении Symfony2.8 / Doctrine2 мне нужно хранить в каждой строке таблицы SQL идентификатор пользователя, который создал или обновил строку (пользователи могут подключаться к Ldap).

Итак, все мои объекты, унаследованные от GenericEntity которые содержат эту переменную (тип будет строкой, если я хочу сохранить имя пользователя Ldap):

 /** * @var integer * * @ORM\Column(name="zzCreationId", type="string", nullable=false) */ private $creationId; 

И я использую prePersistCallback() чтобы автоматически назначить это значение:

 /** * @ORM\PrePersist */ public function prePersistCallback() { $currentUser = /* ...... ????? ....... */ ; if ($currentUser->getId() != null) { $this->creationId = $currentUser->getId() ; } else { $this->creationId = 'unknown' ; } return $this; } 

Но я не знаю, как отследить подключенного пользователя или как автоматически вставить его в объект … Как я могу это сделать?

Вместо этого вы можете использовать прослушиватель / подписчик сущности Doctrine и ввести токен безопасности и регистрировать текущего пользователя:

 // src/AppBundle/EventListener/EntityListener.php namespace AppBundle\EventListener; use Doctrine\ORM\Event\LifecycleEventArgs; use AppBundle\Entity\GenericEntity; class EntityListener { private $tokenStorage; public function __construct(TokenStorageInterface $tokenStorage = null) { $this->tokenStorage = $tokenStorage; } public function prePersist(LifecycleEventArgs $args) { $entity = $args->getEntity(); // only act on some "GenericEntity" entity if (!$entity instanceof GenericEntity) { return; } if (null !== $currentUser = $this->getUser()) { $entity->setCreationId($currentUser->getId()); } else { $entity->setCreationId(0); } } public function getUser() { if (!$this->tokenStorage) { throw new \LogicException('The SecurityBundle is not registered in your application.'); } if (null === $token = $this->tokenStorage->getToken()) { return; } if (!is_object($user = $token->getUser())) { // eg anonymous authentication return; } return $user; } } 

Затем зарегистрируйте слушателя:

 # app/config/services.yml services: my.listener: class: AppBundle\EventListener\EntityListener arguments: ['@security.token_storage'] tags: - { name: doctrine.event_listener, event: prePersist } 

@ORM\PrePersist и другие методы обратного вызова, используемые в сущности, предполагают содержать простую логику и быть независимыми от других сервисов.

Вам необходимо создать прослушиватель событий или подписчик, чтобы прослушать postPersist доктрины postPersist и заполнить соответствующий атрибут. Как зарегистрировать слушателей и подписчиков

Вы можете посмотреть BlameableListener из пакета gedmo / doctrine-extensions, которые работают почти так, как вы хотите, но с именем пользователя, а не с идентификатором пользователя.