4

Zend Framework 2のイベントにイベント リスナーをアタッチする方法はありdispatch.errorますか? そのリスナーは、Module.php に関連する EventManager にのみアタッチされますか?

リスナーをdispatchグローバルな SharedManager にアタッチし、現在の Module.php の名前空間を最初のパラメーターとして渡すことで、これを実現しました。美しく動作しますが、同じことを試してみるとうまくいきませんdispatch.error

Module.php の例を次に示します。

public function init(ModuleManager $moduleManager)
{
    $sharedManager  = $moduleManager->getEventManager()->getSharedManager();
    $sharedManager->attach(__NAMESPACE__, 'dispatch', function($e) {
        exit('IT WORKS');
    });
    $sharedManager->attach(__NAMESPACE__, 'dispatch.error', function($e) {
        exit('IT DOES NOT WORK');
    });
}
4

1 に答える 1

1

ディスパッチでは機能するが、dispatch.error では機能しない理由は、ディスパッチ イベントがコントローラー内からトリガーされるためです (Zend\Mvc\Controller\AbstractController::dispatch を参照)。

このクラスを独自の名前空間コントローラーで拡張するため、イベントをその名前空間に関連付けることができます。

ただし、dispatch.error イベントは、コントローラー (および名前空間のコンテキスト) が読み込まれる前にトリガーされる場合があります。これは、Zend\Mvc\DispatchListener の複数の条件に従って発生します。

dispatch.error の処理方法をカスタマイズするには、そのイベントのカスタム リスナーを作成するか、独自の DispatchListener を作成する必要があります (ただし、それはお勧めしません)。その後、おそらく routeMatch を見て、次に何をしたいかを把握できます。ModuleRouteListener を使用している場合、これは非常に簡単です。

于 2013-08-01T15:59:31.423 に答える