2011-09-03 16 views
14

私はSymfony 2を使用してプロジェクトを作成していますが、コントローラのアクションの前に呼び出されるZendのpreDispatchのようなメソッドが必要です。私はSymfonyで非常に新しく、ネットのサーフィンをして少し前にSymfonyの古いバージョンにpreExecuteメソッドがあることが判明しましたが、今は消えてしまいました。私の問題を解決するために何が使えますか?Symfony2のZend preDispatchメソッドの作成方法

ありがとうございます。

答えて

10

symfony1のpreExecute()メソッドは非常に簡単ですが、あなたが言ったように、Symfony2では利用できません。幸いにも、Symfony2ではイベントにアクセスできます。このフレームワークは、アプリケーションのライフサイクル中に多数のイベントを送出します。 の一部は、イベントのの一部です - http://symfony.com/doc/2.0/book/internals.html#eventsです。

ウェブデバッグツールバーを使用して、どのイベントがディスパッチされているのか、またそのイベントをリッスンしているクラス(EventListeners)を見ることができます。上記のリンクも、あなたがそれに精通していない場合に備えて、イベントシステム全体について詳しく説明しています。

残念ながら、私はpreExecute機能を自分自身に模倣する必要はありませんでしたので、聞く必要があるイベントは正確にはわかりませんが、ドキュメントを読むことで、必要なものを正確に把握できます。

これが役に立ちます。

+0

ご提案をありがとう多くを、それが私を助けてくれました。 – haynar

18

@Armsが私に示唆していたように、私はSymfony 2のイベントメカニズムを探求し始めました。コードを書き留めて、私の問題を解決しました(YAMLで行っているすべての設定です。 XMLやPHPでもやってください)。

まず、Symfonyの設定で、どんな種類のイベントを聞きたいのか、イベントが発生したときにカーネルが呼び出すべきものを記述する必要があります。オープン設定ファイルアプリ\ CONFIG \ config.ymlこのため、次のコードを追加:あなたのクラスは次のようにonKernelControllerメソッドを実装する必要があり

services: 
    younamespace.yourbundle.listener.preexecute: 
     class: Location\Of\Your\Listener\Class 
     tags: 
      - { name: kernel.event_listener, event: kernel.controller, method: onKernelController } 

を:このすべての後

public function onKernelController(FilterControllerEvent $event) { 
    if(HttpKernelInterface::MASTER_REQUEST === $event->getRequestType()) { 
     $controllers = $event->getController(); 
     if(is_array($controllers)) { 
      $controller = $controllers[0]; 

      if(is_object($controller) && method_exists($controller, 'preExecute')) { 
       $controller->preExecute(); 
      } 
     } 
    } 
} 

をあなたのコントローラにpreExecuteメソッドを作成するときには、アクションを実行する前に呼び出されるので、変数の初期化やDBへの書き込みなどの前に、そのメソッドで多くのことを行うことができます。あなたはまた、詳細here構成を見ることができます

(この例では、kernel.requestイベントのためですが、それはあなたが理解するのを助けることができる)

楽しもう;)

+1

コントローラーはクロージャーなので、コントローラーの 'is_array()'とその配列の最初の項目の 'is_object()'をチェックする必要があります。 – igorw

+0

はい:あなたは正しいよ – haynar

+2

+1とても良い解決策と説明! –

関連する問題