Symfony - 无法找到Event's Listener

时间:2017-08-09 09:41:12

标签: symfony events dispatch

我遇到Symfony中的事件问题。我不明白它的运作方式。这是我的听众:

class ClientVisitedListener implements EventSubscriberInterface
{

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

我的service.yml

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

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

2 个答案:

答案 0 :(得分:2)

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

function onRowSelected(e) {
    var gview = $("#grid").data("kendoGrid");
    //Getting selected item
    var selectedItem = gview.dataItem(gview.select());
    var colValue = selectedItem["<columnName>"];
}

编译容器时,它使用compiler passes。编译器传递是一个对象,在编译时,它将tags: - { name: kernel.event_subscriber } 作为参数并可以对其执行某些操作。例如,迭代所有服务,检查它们是否有标记(在这种情况下为ContainerBuilder),如果是,则使用它做一些事情。

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

它是如何知道在事件发生时需要调用哪些服务的 - 当它发生时,EventDispatcher实例已经注册了所有侦听器/订阅者并且只是调用它们。

答案 1 :(得分:0)

当事件发生时,订阅此事件的侦听器将执行一些代码。这是我实现它的方式。

我的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;
    }
}