Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Symfony 如何使Evenlister容器意识到_Symfony_Doctrine - Fatal编程技术网

Symfony 如何使Evenlister容器意识到

Symfony 如何使Evenlister容器意识到,symfony,doctrine,Symfony,Doctrine,在Eventlister中,我希望获得security.encoder\u工厂。侦听器UserManager确实知道容器,因此$this->get('security.encoder\u factor')显然无法工作。如何在此侦听器中获取security.encoder\u factory属性 服务: services: my.listener: class: Bla\OrmBundle\EventListener\UserManager tags:

在Eventlister中,我希望获得
security.encoder\u工厂
。侦听器
UserManager
确实知道容器,因此
$this->get('security.encoder\u factor')
显然无法工作。如何在此侦听器中获取
security.encoder\u factory
属性

服务:

services:
    my.listener:
        class: Bla\OrmBundle\EventListener\UserManager
        tags:
            - { name: doctrine.event_listener, event: prePersist }
用户管理器:

class UserManager  {
   public function prePersist(LifecycleEventArgs $args)
    {
        $entity = $args->getEntity();

        if ($entity instanceof User) {
            $factory = $this->get('security.encoder_factory');

            $encoder = $factory->getEncoder($entity);
            $password = $encoder->encodePassword($entity->getPassword(), $entity->getSalt());
            $entity->setPassword($password);
        }
    }
}

您可以只将容器注入其中(但这通常不是一个好的做法,所以尽可能避免):

类别:

class UserManager {
    protected $container;

    public function __construct(\Symfony\Component\DependencyInjection\ContainerInterface $container) {
        $this->container = $container;    
    }

    protected function getEncoderFactory()
    {
        return $this->container->get('security.encoder_factory');
    }
}
class UserManager {
    protected $encoderFactory;

    public function __construct(\Symfony\Component\Security\Core\Encoder\EncoderFactoryInterface $encoderFactory) {
        $this->encoderFactory = $encoderFactory;    
    }
}
服务定义:

services:
    my.listener:
        class: Bla\OrmBundle\EventListener\UserManager
        arguments: [@service_container]
        tags:
            - { name: doctrine.event_listener, event: prePersist }
再说一次,这不是一个好主意!如果不需要,请不要让您的服务容器知道!相反,您可以将编码器工厂注入其中

首选方式 类别:

class UserManager {
    protected $container;

    public function __construct(\Symfony\Component\DependencyInjection\ContainerInterface $container) {
        $this->container = $container;    
    }

    protected function getEncoderFactory()
    {
        return $this->container->get('security.encoder_factory');
    }
}
class UserManager {
    protected $encoderFactory;

    public function __construct(\Symfony\Component\Security\Core\Encoder\EncoderFactoryInterface $encoderFactory) {
        $this->encoderFactory = $encoderFactory;    
    }
}
配置:

services:
    my.listener:
        class: Bla\OrmBundle\EventListener\UserManager
        arguments: [@security.encoder_factory]
        tags:
            - { name: doctrine.event_listener, event: prePersist }

我实施了你的第二个建议。尽管事件似乎不再被触发。在netbeans中,
yml
验证程序在扫描下一个令牌时会出现一个错误“ScannerException”,我们找到了无法启动任何令牌的字符@(64)