1

在 Eventlister 中,我想获得security.encoder_factory. 听众UserManager确实知道容器,所以$this->get('security.encoder_factor')显然不会工作。我应该如何security.encoder_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);
        }
    }
}
4

1 回答 1

3

您可以将容器注入其中(但这通常不是一个好习惯,因此请尽可能避免使用它):

班级:

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

服务定义:

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

同样,这不是一个好主意!如果您不需要,请不要让您的服务容器知道!相反,您可以将编码器工厂注入其中!!!

首选方式

班级:

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 }
于 2013-10-02T20:53:49.573 回答