Symfony 如何使Evenlister容器意识到
在Eventlister中,我希望获得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:
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)