Featured image of post FilterControllerEventでリダイレクトする

FilterControllerEventでリダイレクトする

Twitter ツイート Hatena Bookmark ブックマーク

SymfonyのFilterControllerEventでリダイレクトする方法をいつも忘れてググってしまう・・・。

FilterControllerEvent::setController()って引数はcallableなものであればいいので、無名関数でもいい。 なので、以下のようにRedirectResponseをreturnする無名関数をセットすればリダイレクトする。

1
2
3
$event->setController(function() use ($redirectUrl) {
    return new RedirectResponse($redirectUrl);
});

普通にControllerが呼び出されたときは何がセットされているのか?

ちょっと疑問に思ったのは普通にコントローラが呼び出されるときに$event->getController();には何が入っているのか? 答えはコントローラオブジェクトとメソッド名が配列になってい入っている。
一瞬callableじゃなくね?って思ってしまったのだが、これcallableなんですよね。 配列の0番にオブジェクト、1番に実効するメソッドってやるcallableになる。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
class Hoge
{
    public function fuga()
    {
        return 'fuga';
    }
}

$hoge = new Hoge();

$arr = [$hoge,'fuga']
$arr()

ちなみにstaticメソッドも呼び出すことができる

1
2
3
4
5
6
7
8
9
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

comments powered by Disqus
Built with Hugo
テーマ StackJimmy によって設計されています。