CakePHPの基本的なURLの構造は以下のようになります。
http://xxxxxx/コントローラー名/アクション名
今回はこの「コントローラ名/アクション名」の部分を変更したい時のやり方を紹介していきます。
ルーティングとは
ルーティングを設定することで、URLとコントローラーのアクションをマッピングをすることができます。
デフォルトの状態だと、URLは「/コントローラー名/アクション名」となります。例えば、Aritclesコントローラーのviewアクションを実行したいときのURLは「articles/view」になります。
簡単な設定
ルーティングの設定は「config/routes.php」に記載されています。
Router::scope('/', function (RouteBuilder $routes) {
$routes->connect('/', ['controller' => 'Articles', 'action' => 'index']);
$routes->connect('/pages/*', ['controller' => 'Pages', 'action' => 'display']);
$routes->fallbacks(DashedRoute::class);
});
書き方はこのようになります。
$routes->connect('(任意に設定したいURL)', ['controller' => '紐つけるコントローラー', 'action' => '紐つけるアクション']);
例えば、デタラメなURL「test1/test2/test3」でArticlesコントローラーのindexにアクセスしたいときは、
$routes->connect('/test1/test2/test3’, ['controller' => 'Articles', 'action' => 'index']);
という具合に設定してあげれば良いのです。
とりあえずここまでで簡単なURLの変更程度ならできると思います。
パラメーターを渡す処理も絡める
Articlesコントローラーのviewアクションで、渡されたパラメーターの記事を表示するとします。
例えば、IDが「5」の記事を閲覧するときに以下のようなURLになっていました。
/articles/view/5
viewアクションの中では、パラメーター「5」を受け取って、idが「5」の記事を取得し、表示させています。
それと同じ動作を「articles/5」で行いたかったので以下のように記述しました。
$routes->connect('/articles/:id', ['controller' => 'Articles', 'action' => 'view']);
URL「articles/◯◯」でArticlesコントローラーのviewアクションを実行します。
◯◯の部分を「:id」としてあるので、Viewアクション内では、◯◯の値を「$this->request->params[‘id’];」で受け取ることができます。
しかしこのままだと、Aritclesコントローラーの別のアクションのURLを生成したいときに不都合があります。例えばURLを「articles/edit」にすると、viewアクションに「edit」を渡して実行してしまいます。
そこで、「:id」にバリデーションをかけ、「:id」が特定の条件下でこのルーティングを有効化させることができます。
$routes->connect('/articles/:id', ['controller' => 'Articles', 'action' => 'view'])
->setPatterns(['id' => '\d+']);
「setPatterns([‘id’ => ‘\d+’])」で「id」を正規表現でバリデーションをかけています。この場合、「id」は数字のみ受け付けるようになります。
例えば、「articles/5」のように「:id」の部分が数字なら、このルーティングの設定が有効化され、「5」をパラメーターとしてArticlesコントローラーのviewに渡すことができるようになります。逆に数字でない場合、このルーティングの設定は無視され、viewアクションではなく「:id」部分に記述されたアクションを実行してくれます。
もっと細かい設定をしてみたい
これまで説明した内容は簡単ではありますが色々と汎用性はあると思います。
もっとURLで細かな設定をしたいという方はこちらを参考にしてみてください。
飲食業界からIT業界に転身してきて現在2年目です。PHPの経験がメインとなります。これまで自分がPHPを扱ってきた上で、モヤモヤしてきたことをメインに記事にしていきますのでよろしくお願いいたします。