CakePHP3で、子クラスのControllerからAppControllerのbeforeFilter()を呼び出し内部でredirect()したら、なぜかController内のactionを必ず通ってからリダイレクトされてしまう現象の対処方法

Bake-with-CakePHP Logo

表題の通り。これ結構ハマったので、技術メモとして残しておきます。

【前提】子クラスのController内でbeforeFilter()を定義し、parent::beforeFilter()を呼び出してredirect()をさせる処理がある

AppControllerを継承するUsersControllerがあったとします。中身はこんな感じ:

AppControllerの中身はこんな感じ:

これでUsersControllerのindex()にアクセスしようとすると、index()の処理を通過せずに/loginにリダイレクトされることが期待できそうです。

【問題】リダイレクトはされたが、なぜかUsersControllerのindex()内を通過してからリダイレクトされてしまう

実際リダイレクトされるにはされたのですが、どういうわけかUsersControllerのindex()の処理を通過してからリダイレクトされてしまうという現象が起こりました。なぜか?

【解決方法】子クラスからparent::beforeFilter()を呼び出しその中のredirect()を即実行したければ、子クラス内でparent::beforeFilter()からreturnされるResponseオブジェクトを受け取りさらにreturnせよ

つまり、下記のように書き換えるのが正解らしいです:

解決の際に参考にした記事はこちら:https://github.com/cakephp/cakephp/issues/6705