概要
EC-CUBEで/logout
のパスにアクセスするとNotFoundHttpExceptionが発生します。
原因:
UserDataControllerに下記のようなRoutingを設定していたためです。
/**
* @Route("/{route}", name="user_data", requirements={"route": "([0-9a-zA-Z_\-]+\/?)+(?<!\/)"}, methods={"GET"})
*/
public function index(Request $request, $route)
~~~
カスタムページのuser_data/{ページ名}
からuser_dataを消すためにこのようなルーティングを設定しましたが、結果として/logout
もキャッチしてしまい、エラーが発生するようになってしまいました。
解決策:
priority を使用して、ルーティングの優先度を下げることで解決できます。具体的には、ルーティングアノテーションの中にpriority=-1
を追加します。
/**
* @Route("/{route}", name="user_data", requirements={"route": "([0-9a-zA-Z_\-]+\/?)+(?<!\/)"}, methods={"GET"}, priority=-1)
*/
public function index(Request $request, $route)
他の解決策:
他にも/logout
のアクションを独自で定義して、カスタムページのルーティングよりも優先順位を高くする方法もありますが、ログアウトを再実装する際には、セッションの破棄や認証の解除など、セキュリティ上の重要な処理を実装することになるため、注意が必要です。
まとめ
Symfonyのルーティングに関する勉強をしていて、priority の存在を知っていたため、このような解決方法を思いつきました。今後も、SymfonyやPHPの勉強を進め、実務で役立てていきたいと思います。