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 }

繰り返しますが、これは良い考えではありません。必要がない場合は、サービス コンテナーを認識させないでください。代わりに、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 }
于 2013-10-02T20:53:49.573 に答える