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をカスタマイズする | (株)シャルーン