FilterControllerEventでリダイレクトする

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

comments powered by Disqus