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;
}

Что не так

Ответы на вопрос(1)

Ваш ответ на вопрос