Symfony - 无法找到事件的监听器
Symfony - Can't to find Event's Listener
我对 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 }
在所有系统中,我没有任何调度程序。它是如何工作的?
这个过程从哪里开始?也许在内核中?
你能帮我理解那个过程吗?
当事件发生时,订阅该事件的监听器将执行一些代码。这是我的实现方式。
我的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());
}
}
事件 class:
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;
}
}
这是理解这里发生的事情的关键:
tags:
- { name: kernel.event_subscriber }
编译容器时,它使用compiler passes。 Compiler pass 是一个对象,在编译时,它获取 ContainerBuilder
作为参数并且可以用它做一些事情。例如遍历所有服务,检查它们是否有标签(在本例中为 kernel.event_subscriber
),如果有,则对其进行处理。
在这种情况下,有这样的编译器传递,它接受所有具有 kernel.event_subscriber
标记的服务并将它们添加到 EventDispatcher
,它已经存在于 Symfony 核心中(所以是的,你有一个事件调度程序,虽然你可能不知道)。
这就是它知道事件发生时需要调用哪些服务的方式 - 当事件发生时,EventDispatcher
实例已经注册了所有 listeners/subscribers 并简单地调用它们。
我对 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 }
在所有系统中,我没有任何调度程序。它是如何工作的? 这个过程从哪里开始?也许在内核中? 你能帮我理解那个过程吗?
当事件发生时,订阅该事件的监听器将执行一些代码。这是我的实现方式。
我的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());
}
}
事件 class:
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;
}
}
这是理解这里发生的事情的关键:
tags:
- { name: kernel.event_subscriber }
编译容器时,它使用compiler passes。 Compiler pass 是一个对象,在编译时,它获取 ContainerBuilder
作为参数并且可以用它做一些事情。例如遍历所有服务,检查它们是否有标签(在本例中为 kernel.event_subscriber
),如果有,则对其进行处理。
在这种情况下,有这样的编译器传递,它接受所有具有 kernel.event_subscriber
标记的服务并将它们添加到 EventDispatcher
,它已经存在于 Symfony 核心中(所以是的,你有一个事件调度程序,虽然你可能不知道)。
这就是它知道事件发生时需要调用哪些服务的方式 - 当事件发生时,EventDispatcher
实例已经注册了所有 listeners/subscribers 并简单地调用它们。