6

特定のリクエストに対してSymfony 2アプリケーションによって起動されたすべてのイベントをリッスンするために、イベントリスナーをセットアップすることはできますか(または何か他のことをしますか?)AppKernel

つまり、アプリケーションを参照しapp_dev.php、プロファイラーを使用してすべてのリスナーのリストを表示できることはわかっていますが、ディスパッチ/起動されたすべてのイベントのリストを取得することに興味があります。一部のイベント システムには、すべてのイベントを受信できる特別なグローバル/すべてのリスナーがあることを知っています。Symfony にも同様の機能があるのか​​、それとも特定のページで利用可能なすべてのイベントのリストを取得する別のメカニズムがあるのか​​ 疑問に思っています。

また、イベント ディスパッチャー クラスの 1 つに一時的なデバッグ コードを追加できることもわかっています。

Symfony/Component/EventDispatcher/EventDispatcher.php
Symfony/Component/HttpKernel/Debug/ContainerAwareTraceableEventDispatcher.php
Symfony/Component/EventDispatcher/ContainerAwareEventDispatcher.php

しかし、私はハックや破壊が少ないものを探しています。

Symfony は初めてですが、プログラミングは初めてではありません。これが素朴な質問である場合はお詫びしますが、グーグルで調べても、私が求めているものは明らかになりませんでした。

4

1 に答える 1

6

クリーンな方法は、イベントが発生した場合にロギングまたは実行しようとしているものを実行する独自の EventDispatcher を作成することです。デフォルトのものを見て、それがどのように機能するかを理解してください。

最初にクラスを作成します

use Symfony\Component\EventDispatcher\EventDispatcher;

class MyDispatcher extends EventDispatcher
{

    // sadly those properties aren't protected in EventDispatcher
    private $listeners = array();
    private $sorted = array();


    public function dispatch($eventName, Event $event = null)
    {
        if (null === $event) {
            $event = new Event();
        }

        $event->setDispatcher($this);
        $event->setName($eventName);

        // do something with the event here ... i.e. log it

        if (!isset($this->listeners[$eventName])) {
            return $event;
        }

        $this->doDispatch($this->getListeners($eventName), $eventName, $event);

        return $event;
    }

... 次に、MyDispatcher を symfony のデフォルトとして登録します。

(元の event_dispatcher サービスを上書きすることにより)

アプリ/設定/config.yml

services:
    event_dispatcher:
        class: Vendor\YourBundle\MyDispatcher
        arguments: [@service_container]

... または、サービスの作成時に symfony が使用するクラス パラメータをオーバーライドするだけです。

parameters:
    event_dispatcher.class: Vendor\YourBundle\MyDispatcher
于 2013-06-25T16:38:08.813 に答える