CakePHP4でシステム開発を行っている中、管理画面を作成中にちょっとした疑問が浮かび上がり、予想通りの挙動が見えたので記録します。
AdminというディレクトリをControllerディレクトリに作り、そこに管理画面用のコントローラーを集めるようにしました。
route.phpにはUrlにAdminと入れたら、管理画面用のファイル群を見に行くように設定。
use Cake\Routing\Route\DashedRoute;
$routes->prefix('Admin', function (RouteBuilder $routes) {
// ここのすべてのルートには、 `/admin` というプレフィックスが付きます。
// また、 `'prefix' => 'Admin'` ルート要素が追加されます。
// これは、これらのルートのURLを生成するときに必要になります
$routes->fallbacks(DashedRoute::class);
});
Cakephp公式サイトから引用
同じくroute.phpに、管理画面用URLを入力すると、PagesControllerを見に行くように設定。
$builder->connect(‘/admin/’, [‘controller’ => ‘Pages’, ‘action’ => ‘display’, ‘home’]);
localhost/cakephp/admin と入力するとAdmin/PagesControllerのdisplayアクションを実行
そして、Adminディレクトリに上位の場所にあるAppControllerとPagesControllerをコピーして複製しました。
それぞれのファイルの上部に名前空間を書き換えて、あとはそれぞれのテンプレートファイルを準備。
ブラウザに開発用のURL「localhost/cakephp/admin」と入力すると、一応表示は確認できました。
そんな中、PagesControllerに独自のアクションを追記し、DBと接続しないページを作ろうとしました。例として、site()というアクションを追加するとします。そして、route,phpにはPagesと入力しなくてもよいように設定をします。
// Admin/PagesController.php内
public function login() {
echo "test";
}
$builder->connect('/admin/site', ['controller' => 'Pages', 'action' => 'site']);
これで、localhost/cakephp/admin/site と入力すると、testと表示すると思いましたが、site()はありませんよ的なエラーが表示しました。
不思議に思い調べてみると、connectの所でもprefixは設定しないといけないことが分かりました。今のままでは一つ上位のPagesControllerを見に行くようになるようで、そのControllerには確かにsite()は作っていません。
というわけで、ルート設定を以下のように変えます。
$builder->connect('/admin/site', ['prefix' => 'Admin', 'controller' => 'Pages', 'action' => 'site']);
こうすることで、Admin/PagesControllerを見に行くようになるようです。