我希望在将User
对象保存到数据库之前注册Doctrine事件侦听器以哈希用户的密码:
这是我的Event Listener类:
<?php
namespace AppBundle\Doctrine;
use AppBundle\Entity\User;
use Doctrine\Common\EventSubscriber;
use Doctrine\ORM\Event\LifecycleEventArgs;
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
class HashPasswordListener implements EventSubscriber
{
private $passwordEncoder;
public function __construct(UserPasswordEncoderInterface $passwordEncoder)
{
$this->passwordEncoder = $passwordEncoder;
}
public function getSubscribedEvents()
{
return ['prePersist', 'preUpdate'];
}
public function prePersist(LifecycleEventArgs $args)
{
$entity = $args->getEntity();
if (!$entity instanceof User) {
return;
}
$this->encodePassword($entity);
}
/**
* @param User $entity
*/
private function encodePassword(User $entity)
{
$encoded = $this->passwordEncoder->encodePassword($entity, $entity->getPlainPassword());
$entity->setPassword($encoded);
}
public function preUpdate(LifecycleEventArgs $args)
{
$entity = $args->getEntity();
if (!$entity instanceof User) {
return;
}
$this->encodePassword($entity);
}
}
我在services.yml
文件
AppBundle\Doctrine\HashPasswordListener:
tags: ['doctrine.event_listener']
但是每当我想通过加载灯具数据或从Web应用程序插入用户时,我都会收到这样的错误:
[Symfony\Component\DependencyInjection\Exception\InvalidArgumentException]
Doctrine event listener "AppBundle\Doctrine\HashPasswordListener" must specify the "event" attribute.
我尝试在tags
中添加无法正常工作的事件属性。
我使用Symfony版本3.3和Doctrine 2.5
config.yml
中配置的学说:
doctrine:
dbal:
driver: pdo_sqlite
path: '%kernel.project_dir%/app/sqlite.db'
charset: UTF8
错误在哪里?
答案 0 :(得分:2)
您使用un订户,因此您必须标记doctrine事件订阅者而不是需要属性事件的事件侦听器。
的appbundle \学说\ HashPasswordListener:
标签:['doctrine.event_subscriber']
答案 1 :(得分:0)
service.yml
中配置事件监听器,所以:
AppBundle\Doctrine\HashPasswordListener:
tags:
- { name: doctrine.event_listener, event: prePersist }
- { name: doctrine.event_listener, event: preUpdate }
这很有效。
答案 2 :(得分:0)
你也可以在Entity里面添加一个EventListener
/**
* @ORM\Entity(repositoryClass=XXXX::class)
* @ORM\HasLifecycleCallbacks() NEED IT !
* @ORM\EntityListeners({"App\EventListener\XXXXListener"})
*/
class XXX
然后在你的 EventListener 中:
class XXXListener
{
public function preUpdate(XXX $xxx, PreUpdateEventArgs $event): void
{
$xxx->setDateUpdate(new DateTime());
}
}
答案 3 :(得分:-1)
您需要在services.yml文件中为该事件侦听器配置event属性。它不会工作,这就是你看到错误信息的原因。
有关完整示例,请参阅