Давайте предположим, что у меня есть два класса сущностей:
\AppBundle\Entity\User
— пользовательский провайдер;
\AppBundle\Entity\Article
Простая статья.
Article
Класс также имеет эти свойства:
author
— указание на пользователя, который создал эту конкретную сущность;
updatedBy
— указание пользователю, который недавно обновил содержание конкретной статьи.
Как передать текущий зарегистрированный пользовательский объект Article
субъект для установки определенных значений на author
и / или updatedBy
свойства на бэкэнде, генерируемые EasyAdminBundle на Symfony 3.0.1?
Если вы находитесь в контроллере, вы просто делаете это
$article->setAuthor($this->getUser());
$article->setUpdatedBy($this->getUser());
Или же
Если вы хотите, чтобы это было автоматически
Вам нужно объявить слушателя на событии Doctrine. В вашем случае я предполагаю preUpdate, включая текущего пользователя.
Здесь очень хорошая документация http://symfony.com/doc/current/cookbook/doctrine/event_listeners_subscribers.html
Я редактирую здесь, чтобы ответить на ваш комментарий
Не волнуйтесь, вы можете внедрить пользовательскую сущность, когда объявите слушателя как Service
Например :
services:
your_listener:
class: App\AppBundle\Your_Listener
arguments: ["@security.token_storage"]
Ваш слушатель:
private $current_user;
public function __construct($security_context) {
if ($security_context->getToken() != null) {
$this->current_user = $security_context->getToken()->getUser();
}
}
Теперь вы можете сделать
$entity= $args->getEntity(); // get your Article
if (!$entity instanceof Article) {
return;
}
$entity->setAuthor($this->current_user);
$entity->setUpdatedBy($this->current_user);
Если у вас есть отношения к автору лица
$em = $this->getDoctrine()->getManager();
$user = new User();
$user->setAuthor($this->getUser());
$em->persist($user);
$em->flush();
на контроллере, но это плохая идея. Используйте команду или другой шаблон проектирования.