2011-06-27 8 views
11

Symfony2ドキュメントの内部の章を読んでいて、カーネルとコントローラのイベントにリスナーを追加すると、Symfony2でイベントリスナーを使用してコントローラを交換しようとしています

public function onKernelController(FilterControllerEvent $event)  
{ 
    $controller = $event->getController(); 

    $replacementControllerName = .... //Some logic to work out the name of the new controller 
    $replacementController = ?? //Not sure what goes here 

    $event->setController($replacementController); 
} 

であれば、私は私はそれのインスタンスをすることを得るのですか、交換用コントローラの名前を働いてきた後、私はわからないんだビット:私は少しこのように動作します何かを持っていますsetControllerに渡すことはできますか?

答えて

17

あなたは

  • 静的メソッドarray('class', 'method')
  • インスタンスメソッドarray($instance, 'method')
  • 匿名関数function() { ... }
  • 通常のグローバル関数のようなものを意味し、任意の呼び出し可能にあなたのコントローラを設定することができます'function';
  • __invoke()方法new MyClassImplementingInvoke()
  • classの新しいインスタンスを作成するためにControllerResolverを強制的に特別な構文'class::method'(任意の引数なしのコンストラクタを呼び出す)、呼び出し可能array($instanceOfClass, 'method')

を返すを実装するクラスのインスタンス編集:

私は間違ってControllerResolverを探しました。 symfonyを標準設定で実行する場合、Symfony\Bundle\FrameworkBundle\Controller\ControllerResolverSymfony\Component\HttpKernel\Controller\ControllerResolverではなく)を使用します。コントローラーの名前は、私が上に書いたものと少し違って扱われます。

次の例では、コントローラの設定時に考えられるすべてのオプションをまとめています。

応答のための
public function onKernelController(FilterControllerEvent $event)  
{ 
    $controller = $event->getController(); 
    // call method in Controller class in YourBundle 
    $replacementController = 'YourBundle:Controller:method'; 
    // call method in service (which is a service registered in the DIC) 
    $replacementController = 'service:method'; 
    // call method on an instance of Class (created by calling the constructor without any argument) 
    $replacementController = 'Class::method'; 
    // call method on Class statically (static method) 
    $replacementController = array('Class', 'method'); 
    // call method on $controller 
    $controller   = new YourController(1, 2, 3); 
    $replacementController = array($controller, 'method'); 
    // call __invoke on $controller 
    $replacementController = new YourController(1, 2, 3); 
    $event->setController($replacementController); 
} 
+0

おかげで、私はまだsymfonyはそれを作成したかのようにそれが動作するように、コントローラの設定を取得するための最良の方法は、これらのオプションのどちらである、何かの作業を取得し、トラブルを抱えていますか? – pogo

+0

それはオプション6になります。 –

+0

申し訳ありません私はばかげているかもしれませんが、私はこの作業を行う方法がまだ分かりません。いくつかのサンプルコードを投稿できますか?クラス::メソッドは常に静的メソッドを参照していたので、ControllerResolverをどのようにトリガするのか分かりませんでしたので、ちょっと混乱しています。 – pogo

関連する問題