2017-08-09 14 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タグを持つすべてのサービスを受け取り、symfonyコアに既に存在するEventDispatcherに追加します(そうではありませんが、あなたはイベントディスパッチャを持っています)。

イベントが発生したときに呼び出される必要のあるサービスを知る方法です。発生すると、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; 
    } 
} 
関連する問題