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を見に行くようになるようです。