【问题标题】:Symfony add event listenerSymfony 添加事件监听器
【发布时间】:2016-07-07 11:22:39
【问题描述】:

我使用 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 }

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

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

【问题讨论】:

    标签: symfony


    【解决方案1】:

    我会给你一个非常简单的例子,但你需要根据自己的情况进行调整。它应该相当简单。它只会给你一个公平的想法,而不是一个现实生活中的例子。

    更多示例: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
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        您可以在您发布的事件定义中看到使用 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()

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-06-13
          • 1970-01-01
          • 1970-01-01
          • 2015-12-19
          • 2018-04-10
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多