Symfony添加事件监听器

时间:2016-07-07 11:22:40

标签: symfony

我使用symfony和easy admin,我想听事件easy_admin.pre_persist

在简单的管理控制器中,它会调用此事件:

$this->dispatch(EasyAdminEvents::PRE_PERSIST, array('entity' => $entity));

这就是:

/** @Event("Symfony\Component\EventDispatcher\GenericEvent") */
const PRE_PERSIST = 'easy_admin.pre_persist';

如果我在同一个控制器中为此事件添加侦听器,请执行以下操作:

    $ed = $this->get('event_dispatcher');

    $ed->addListener('easy_admin.pre_persist', function($e) {
        echo 'it works!';
        die();
    });

......它有效。

但我想在其他地方添加这个监听器。我认为services.yml将是它的好地方。我在Sf文档中读过,我应该这样添加服务:

# app/config/services.yml
services:
    app.exception_listener:
        class: AppBundle\EventListener\ExceptionListener
        tags:
            - { name: kernel.event_listener, event: kernel.exception }

但有两个属性 - 名称和事件。我只知道事件名称easy_admin.pre_persist

它是如何工作的?此事件的name是什么,event是什么? 如果我可以为easy_admin.pre_persist添加监听器,我该如何将此监听器添加到services.yml?

3 个答案:

答案 0 :(得分:3)

我会给你一个非常简单的例子,但你需要让它适应你的。它应该相当简单。它只会给你一个公平的想法,而不是一个真实的例子。

更多示例:http://www.inanzzz.com/index.php/posts/symfony

<强> UserController.php

class UserController
{
    ....

    public function createAction()
    {
        $user = new User();
        $user->setUsername('username');
        $user->setPassword('password');

        $this->entityManager->persist($user);
        $this->entityManager->flush();
    }

    ....
}

<强> Services.yml

services:
    application_backend.listener.user_entity:
        class: Application\BackendBundle\Listener\UserEntityListener
        tags:
                - { name: doctrine.event_listener, event: prePersist }

<强> UserControllerListener.php

namespace Application\BackendBundle\Listener;

use Application\BackendBundle\Entity\User;
use Doctrine\ORM\Event\LifecycleEventArgs;

class UserEntityListener
{
    public function prePersist(LifecycleEventArgs $args)
    {
        $entity = $args->getEntity();

        if ($entity instanceof User) {
            // Do whatever you want
        }
    }
}

答案 1 :(得分:2)

您需要知道侦听器的类和要调用的方法的名称。两者都取决于简单的管理员(对不起,从未使用它)。所以看看简单的管理员代码

答案 2 :(得分:1)

您可以在发布的事件定义中看到使用symfony泛型事件,因此您应该监听内核并且标记名称属性应该是kernel.event_listener

# app/config/services.yml
services:
    app.exception_listener:
        class: YourBundle\EventListener\EasydminPrePersitListener
        tags:
            - { name: kernel.event_listener, event: easy_admin.pre_persist, method: onPrePersist }

在Listener类中,您可以定义onPrePersist()

的方法