【问题标题】:Symfony - Can't to find Event's ListenerSymfony - 找不到事件的监听器
【发布时间】:2017-08-09 09:41:11
【问题描述】:

我对 Symfony 中的事件有疑问。我不明白它是如何工作的。这是我的听众:

class ClientVisitedListener implements EventSubscriberInterface
{

public static function getSubscribedEvents()
{
    return
    [
        KernelEvents::REQUEST  => 'sprawdz',
    ];
}

我的服务.yml

anderos_invoice.invoice_club_listener:
class: Anderos\AcpPriceBundle\EventListener\InvoiceClubListener
arguments: [@service_container]
tags:
    - { name: kernel.event_subscriber } 

在所有系统中,我没有任何调度程序。它是如何工作的? 这个过程的起点在哪里?也许在内核中? 你能帮我理解那个程序吗?

【问题讨论】:

    标签: symfony events dispatch


    【解决方案1】:

    这是了解这里发生的事情的关键:

    tags:
        - { name: kernel.event_subscriber }  
    

    当容器被编译时,它使用compiler passes。 Compiler pass 是一个对象,在编译时,它获取ContainerBuilder 作为参数并且可以用它做一些事情。例如遍历所有服务,检查它们是否有标签(在这种情况下为kernel.event_subscriber),如果有,用它做一些事情。

    在这种情况下,有这样的编译器传递,它将所有具有 kernel.event_subscriber 标签的服务添加到 EventDispatcher,它已经存在于 Symfony 核心中(所以是的,你有一个事件调度程序,尽管你可能不知道它)。

    这就是它知道在事件发生时需要调用哪些服务的方式 - 当它发生时,EventDispatcher 实例已经注册了所有侦听器/订阅者并简单地调用它们。

    【讨论】:

    • 非常感谢您的帮助!
    【解决方案2】:

    当一个事件发生时,订阅该事件的监听器会执行一些代码。以下是我的实现方式。

    我的 service.yml:

    app.listener.bot.logger:
        class: AppBundle\Listener\BotLoggerListener
        arguments: ['@logger']
        tags:
            - { name: monolog.logger, channel: bot }
             - { name: kernel.event_listener, event: bot.log.message, method: 'onBotMessage' }
    

    在我的控制器中:

        $event = new BotLogMessage('Request finish ');
        $this->get('event_dispatcher')->dispatch($event::NAME, $event);
    

    听者:

    namespace AppBundle\Listener;
    use AppBundle\Event\BotLogRequestEvent;
    use AppBundle\Event\BotLogResponseEvent;
    use AppBundle\Event\BotLogMessage;
    use Psr\Log\LoggerInterface;
    class BotLoggerListener
    {
        private $logger;
        /**
        * BotLoggerListener constructor.
        * @param LoggerInterface $logger
        */
        public function __construct(LoggerInterface $logger)
        {
            $this->logger = $logger;
        }
        /**
        * @param BotLogMessage $event
        */
        public function onBotMessage(BotLogMessage $event)
        {
            $this->logger->info('[Log Message] : ' . $event->getMessage());
        }
    }
    

    事件类:

    namespace AppBundle\Event;
    use AppBundle\Model\BotRequest\BotRequestInterface;
    use Symfony\Component\EventDispatcher\Event;
    class BotLogMessage extends Event
    {
        const NAME = 'bot.log.message';
        /**
         * @var string
         */
        private $message;
    
        /**
         * @param string $message
         */
        public function __construct($message)
        {
            $this->message = $message;
    }
    
        /**
         * @return string
         */
        public function getMessage() : string
        {
            return $this->message;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-25
      • 2015-12-19
      • 1970-01-01
      • 1970-01-01
      • 2014-07-27
      • 1970-01-01
      • 1970-01-01
      • 2019-07-06
      相关资源
      最近更新 更多