Symfony2: инъекция @ security.context для получения текущего пользователя. Как избежать «ServiceCircularReferenceException»? Залить весь контейнер? [Дубликат]
На этот вопрос уже есть ответ:
Внедрение SecurityContext в prePersist или preUpdate прослушивателя в Symfony2, чтобы получить пользователя в createBy или updatedBy. Причины ошибки циркулярной ссылки 4 ответаПриходящий изэта почт и после исправления я нахожусь в другой проблеме / секретном вопросе / проблеме.
Как вы можете видеть в другом посте, я пытаюсь внедрить контекст безопасности в слушателя, но если я оставлю код без изменений, я получу эту ошибку:
ServiceCircularReferenceException: обнаружена циклическая ссылка для службы "doctrine.orm.default_entity_manager"
Так, читая и исследуя, я нашел решение, но мне не ясно, является ли это правильным или безопасным для моего приложения. Вот что я сделал:
Вместо инъекции[@security.context]
Я сделал это
services:
orderhascomment.listener:
class: PL\OrderBundle\Listener\OrderHasCommentListener
arguments: [@service_container]
tags:
- { name: doctrine.event_listener, event: prePersist, method: onPrePersist }
И мой слушательOrderHasCommentListener.php
выглядит следующим образом:
namespace PL\OrderBundle\Listener;
use Doctrine\ORM\Event\LifecycleEventArgs;
use Symfony\Component\DependencyInjection\ContainerInterface;
class OrderHasCommentListener {
protected $container;
public function __construct(ContainerInterface $container = null) {
$this->container = $container;
}
/**
*
* @param LifecycleEventArgs $args
*/
public function onPrePersist(LifecycleEventArgs $args) {
$entity = $args->getEntity();
$user = $this->container->get('security.context')->getToken()->getUser();
$entity->setUser($user);
}
}
Это правильный путь? Или существует еще один? Я прочитал, что вставлять весь контейнер - плохая идея, так как мне нужен только контекст безопасности, какое тогда решение? https: //insight.sensiolabs.com/what-we-analys)
Попытка конвертировать UserCallable в сервисе
Я пытаюсь конвертироватьUserCallable
в сервисе, следуя инструкциямВо и смотрит наDoctrineBehaviors orm-services.yml file а также посмотреть, как они это делают на BlameableListener но я не могу заставить его работать, так как я получаю эту ошибку:
ContextErrorException: Catchable Fatal Error: Аргумент 1 передан PL \ OrderBundle \ Listener \ OrderHasCommentListener :: __ construct () должен быть вызываемым, строка должна иметь значение
Вот так выглядит мое определение наapp/config/config.yml
:
services:
orderhascomment.listener:
class: PL\OrderBundle\Listener\OrderHasCommentListener
arguments:
- user_callable
tags:
- { name: doctrine.event_listener, event: prePersist, method: onPrePersist }
user_callable:
class: PL\OrderBundle\Util\UserCallable
arguments:
- "@service_container"
public: false
И вот как я перешел к__construct()
функция вOrderHasCommentListener.php
файл
/**
* @param UserCallableInterface $user_callable
* */
public function __construct(callable $user_callable = null) {
$this->userCallable = $user_callable;
}
Что не так