教条事件监听者" ..."必须指定"事件"属性

时间:2017-09-24 13:20:07

标签: php symfony doctrine-orm doctrine event-listener

我希望在将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

错误在哪里?

4 个答案:

答案 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());
    }
}

文档:https://www.doctrine-project.org/projects/doctrine-orm/en/latest/reference/events.html#entity-listeners

答案 3 :(得分:-1)

您需要在services.yml文件中为该事件侦听器配置event属性。它不会工作,这就是你看到错误信息的原因。

有关完整示例,请参阅