2017-08-09 142 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; 
    } 
}