2017-08-09 88 views
-1

我在Symfony的事件中遇到问题。我不明白它是如何工作的。这是我的听众: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 } 

在所有的系统我没有任何调度。怎么运行的? 这个程序的开始在哪里?也许在内核?

回答

1

这是关键要了解这里发生了什么:

tags: 
    - { name: kernel.event_subscriber } 

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

在这种情况下,有这样的编译过程这需要所有的服务有kernel.event_subscriber标签,并将它们添加到EventDispatcher,它已经存在于Symfony的核心(所以是的,你有一个事件调度员,虽然你可能不知道这一点)。

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

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