CakePHP3でルーティングを行う
開発環境は、Windows 10 Pro(64bit) + PHP 7.2.12 + CakePHP 3.7.2 + XAMPP Control Panel v3.2.2。
今回は具体的な事例として、トップページを、PostsController内のindexアクションにしたい場合の書き方を説明。
1. /config/routes.phpを開く
2.以下の部分を変更する
<?php $routes->connect('/', ['controller' => 'Pages', 'action' => 'display', 'home']); ?>
を
<?php $routes->connect('/', ['controller' => 'Posts', 'action' => 'index']); ?>
に変更する。
また、ユーザーが、/posts/indexや、/postsにアクセスしてきたときもトップページに飛ぶように設定しておくには、
<?php $routes->redirect('/posts/', '/',['persist' => true]); ?>
を、config/routes.php内のRouter::scope('/', function (RouteBuilder $routes) { ~ });ブロック内に追加する。
名前付きルーティング
名前付きルーティングとは、その名前のコントローラを作っていなくても、好きな名前をURLに設定することができるものです。Togetterの個別記事ページのようなルーティングを実現したい場合(/li/12345678のようなTogetterの個別記事ページのようなルーティングを書く場合)で、それを、PostsControllerのviewアクションで実現したい場合は、
<?php $routes->connect('/li',['controller' => 'Posts', 'action' => 'view'],['_name' => 'li']); $routes->connect('/li/:id',['controller' => 'Posts', 'action' => 'view']) ->setPatterns(['id' => '\d+']) ->setPass(['id']); ?>
を、config/routes.php内のRouter::scope('/', function (RouteBuilder $routes) { ~ });ブロック内に追加する。
逆に、/posts/view/234のようなアクセスをリダイレクトするためには、
<?php $routes->redirect('/posts/view/:id', ['controller' => 'Posts', 'action' => 'view'], ['persist' => true]) ->setPatterns(['id' => '\d+']) ->setPass(['id']); ?>
を、config/routes.php内のRouter::scope('/', function (RouteBuilder $routes) { ~ });ブロック内に追加する。
※設定を変更したのに、それが反映されない場合の解決法
この部分で、かなり時間を食ってしまったのでメモ。
解決法としては、
1.ブラウザ側のキャッシュを削除する
2.CakePHP側のキャッシュを削除する
/tmp/cache/myapp_cake_routes_route_collection
を削除する。(削除しても、変更すると、新しく生成されるので大丈夫)
自分のケースでは、1.をしても変わりはなくて、2.をしたら変更が反映されました。できれば、両方やっておいたほうがいいでしょう。
■参考リンク
https://book.cakephp.org/3.0/ja/development/routing.html
CakePHP3でルーティングを設定し、URLをカスタマイズする | (株)シャルーン