CakePHP5になってからは何か若干route.phpの設定が変わったそうですが、正直どう変わったかは分かりませんw

本来はそういうところも知った上でシステム構築するのが本当のエンジニアなんでしょうけど。

 

ひとまず、CakePHP5をインストールして、管理画面用のURLを準備するためのプレフィックスルーティング設定をroute.phpにする内容をメモとして記録しておきます。

 

例として、Adminというフォルダをsrc/controllerに作り、ドメイン/Admin/とURL入力した場合、Adminフォルダにあるcontrollerファイルを見に行く形を作る感じにしたいと思います。

 

//route.php

return function (RouteBuilder $routes): void {
  // 既存のスコープ
  $routes->scope('/', function (RouteBuilder $builder): void {
    $builder->connect('/', ['controller' => 'Pages', 'action' => 'display', 'index']);

    // 以下を追加
    $builder->connect('/admin/', ['controller' => 'dashs', 'action' => 'index', 'prefix' => 'Admin']);

    $builder->fallbacks();
  });

  // 「Admin」プレフィックスを追加
  $routes->prefix('Admin, function (RouteBuilder $routes) {
      $routes->fallbacks(DashedRoute::class);
  });
}

 

スコープの外に$routes->prefix()で設定してあげてスコープ内に$builder->connect()でURL設定し、その中にprefixでフォルダ名を指定してあげるとうまくいきました。

公式ドキュメントでは、

 

$routes->prefix('Admin', function (RouteBuilder $routes) {
  // admin スコープの中なので、/admin プレフィックスや、
  // admin ルート要素を含める必要はありません。
  $routes->connect('/', ['controller' => 'Pages', 'action' => 'index']);
});

 

とか書いてたけど、実際にこれを入れてみると、

 

AdminController could not be found.

 

とエラーが表示。うそつきーw

まあ自分のソースがおかしいかもしれないから強く言いませんが、実際うまくはいきませんでしたので、成功したソースだけ残します。

あとはsrc/controllerにあるAppControllerをAdminフォルダにコピペして、各controllerファイル内部の上部にあるuseで示すAppControllerのパスにAdmin追加して終了。

 

use App\Controller\AppController;
use App\Controller\Admin\AppController;

 

毎回CakePHP触る時には管理画面作る場合はトラブっちゃうから記録しないと詰んでしまうw

 

ちなみにChatGPTで解決する方法を聞いてみたら以下のような内容が返ってきました。

 

use Cake\Routing\Route\DashedRoute;
use Cake\Routing\Router;

Router::scope('/', function ($routes) {
  // 管理者用プレフィックス
  $routes->prefix('admin', function ($routes) {
    // 管理ダッシュボード
    $routes->connect('/', ['controller' => 'Dashboard', 'action' => 'index']);
    // デフォルトのルートを設定
    $routes->fallbacks(DashedRoute::class);
  });
});

 

そうしてソースを写し実行してみた結果、

 

Call to undefined method Cake\Routing\Router::scope()

 

エラーw しかも無いときた。

その後、何度聞いても解決方法は上のソースを表示して先に進まず。

ということで、今回は試行錯誤して解決したので終了。