CakePHPの特徴の一つに、Controller名・action名・テンプレートファイル名を規約に沿った名前に統一することで、個別にルーティングを定義しなくても「/Controller名/action名」のURLに該当アクションを紐付けできる機能があります。(以下、デフォルトルーティングと書きます)
できるだけルーティングを書きたくない時には便利なのですが、画面表示が必要ないアクションでもルーティングが有効になってしまったり、URL構成からCakePHP製であることを推測されやすいため、無効化したい場合もあります。
CakePHP4のデフォルトルーティングは、routes.phpで使われているDashedRoute
クラスの機能によるものです。
DashedRouteクラスではなく、Routeクラスを使用するように変更することで無効化できます。
CakePHP初期状態のルーティング一覧
...cakephp>bin/cake routes
+---------------------+--------------------------+--------------------------------------------------------------------+
| Route name | URI template | Defaults |
+---------------------+--------------------------+--------------------------------------------------------------------+
| pages:display | /pages/* | {"action":"display","controller":"Pages","plugin":null} |
| pages:display | / | {"action":"display","controller":"Pages","0":"home","plugin":null} |
| _controller:index | /{controller} | {"action":"index","plugin":null} |
| _controller:_action | /{controller}/{action}/* | {"action":"index","plugin":null} |
+---------------------+--------------------------+--------------------------------------------------------------------+
// 下2行がDashedRouteのデフォルトルーティング用定義
// DebugKit用のルーティングは除外しています。
routes.phpの定義内容から、以下の3行を削除します。
config/routes.php
<?php
- use Cake\Routing\Route\DashedRoute;
use Cake\Routing\RouteBuilder;
- $routes->setRouteClass(DashedRoute::class);
$routes->scope('/', function (RouteBuilder $builder) {
$builder->connect('/', ['controller' => 'Pages', 'action' => 'display', 'home']);
$builder->connect('/pages/*', 'Pages::display');
- $builder->fallbacks();
});
削除後のルーティング一覧
...cakephp>bin/cake routes
+---------------+--------------+--------------------------------------------------------------------+
| Route name | URI template | Defaults |
+---------------+--------------+--------------------------------------------------------------------+
| pages:display | /pages/* | {"action":"display","controller":"Pages","plugin":null} |
| pages:display | / | {"action":"display","controller":"Pages","0":"home","plugin":null} |
+---------------+--------------+--------------------------------------------------------------------+
// デフォルトルーティング用の定義が無くなります。
明示的にルーティングを定義しているURLへは、引き続きアクセスできます。
元々デフォルトルーティングで処理していたURLは、ルーティング定義が無いので404 Not Foundになります。