
FilterControllerEventでリダイレクトする
May 16, 2017,
tags:
symfony
php
SymfonyのFilterControllerEventでリダイレクトする方法をいつも忘れてググってしまう・・・。
FilterControllerEvent::setController()って引数はcallableなものであればいいので、無名関数でもいい。 なので、以下のようにRedirectResponseをreturnする無名関数をセットすればリダイレクトする。
$event->setController(function() use ($redirectUrl) {
return new RedirectResponse($redirectUrl);
});
普通にControllerが呼び出されたときは何がセットされているのか?
ちょっと疑問に思ったのは普通にコントローラが呼び出されるときに$event->getController();
には何が入っているのか?
答えはコントローラオブジェクトとメソッド名が配列になってい入っている。
一瞬callableじゃなくね?って思ってしまったのだが、これcallableなんですよね。
配列の0番にオブジェクト、1番に実効するメソッドってやるcallableになる。
class Hoge
{
public function fuga()
{
return 'fuga';
}
}
$hoge = new Hoge();
$arr = [$hoge,'fuga']
$arr()
ちなみにstaticメソッドも呼び出すことができる
class Hoge
{
public static function fuga()
{
return 'fuga';
}
}
[Hoge::class,'fuga']
最後に
Symfonyは別にControllerクラスを継承する必要もないし、結局Callableなもで、Responseオブジェクトをreturnすればいいみたい。
ほんと柔軟にいろいろなことができて便利ですね。
ちなみに普段Controllerはどう呼ばれているのかとか気になる方はControllerResolverあたりの実装から読んでいくと良いかもです。
参考:php - Symfony2 redirect for event listener? - Stack Overflow