CodeIgniter4のルーティング
CodeIgniter Advent Calendar 2021
CodeIgniter4のルーティングについて解説します。
自動ルーティング
デフォルトでは、CodeIgniter3と同じく、以下の規約により、自動でルーティングされます。
http://example.com/{コントローラ名}/{メソッド名}/{引数1}/{引数2}/...
手動ルーティング
CodeIgniter3と同じく、特定のルートを手動で設定することも可能です。
自動ルーティングをオフに
CodeIgniter3と異なるのは、自動ルーティングをオフに設定できることです。
app/Config/Routes.php
を以下のように変更します。
app/Config/Routes.php
$routes->setAutoRoute(false);
オフに設定するとコントローラがあるだけではルーティングされないため、ルートを設定しない限り、コントローラにアクセスできなくなります。
なお、セキュリティ上の理由から、自動ルーティングは推奨しません。できる限り、オフに設定してください。
HTTPメソッドでのルーティング
ルートは、app/Config/Routes.php
に設定します。
特定のHTTPメソッドを指定してルートを設定することができます。
GETメソッドの場合は、$routes->get()
を使用します。
$routes->get('news', 'News::index');
上記は、http://example.com/news
にアクセスすると、News
コントローラの index()
メソッドが呼び出されます。
POSTメソッドの場合は、$routes->post()
を使用します。
$routes->post('news/create', 'News::create');
上記は、http://example.com/news/create
にアクセスすると、News
コントローラの create()
メソッドが呼び出されます。
$routes->put()
、$routes->delete()
なども同様です。
URLの一部をキャプチャ
(:segment)
、(:any)
などのプレースホルダーを使います。
(:segment)
は1つのURIセグメント、(:any)
は任意の文字列にマッチします。
$routes->get('news/(:segment)', 'News::view/$1');
上記は、/news/foo
の場合に、News
コントローラの view()
メソッドに foo
を渡します。
ルートのグループ化
ルートをグループ化することもできます。
$routes->group('admin', function ($routes) {
$routes->get('users', 'Admin\Users::index');
$routes->get('blog', 'Admin\Blog::index');
});
上記は、admin/users
と admin/blog
のルートを設定しています。
コントローラフィルターの適用
ルートに対してコントローラフィルターを指定することもできます。
以下は、login
というフィルターをルートに適用するサンプルです。
$routes->post('news/create', 'News::create', ['filter' => 'login']);
$routes->group('admin', ['filter' => 'login'], function ($routes) {
$routes->get('users', 'Admin\Users::index');
$routes->get('blog', 'Admin\Blog::index');
});
ルート設定の確認
spark routes
コマンドで設定したルートを確認することができます。
自動ルーティングされるものは表示されません。
$ php spark routes
CodeIgniter v4.1.5 Command Line Tool - Server Time: 2021-12-09 19:48:42 UTC-06:00
+--------+----------------------------+------------------------------------------------+
| Method | Route | Handler |
+--------+----------------------------+------------------------------------------------+
| GET | / | \App\Controllers\Home::index |
| CLI | migrations/([^/]+)/([^/]+) | \CodeIgniter\Commands\MigrationsCommand::$1/$2 |
| CLI | migrations/([^/]+) | \CodeIgniter\Commands\MigrationsCommand::$1 |
| CLI | migrations | \CodeIgniter\Commands\MigrationsCommand::index |
| CLI | ci(.*) | \CodeIgniter\CLI\CommandRunner::index/$1 |
+--------+----------------------------+------------------------------------------------+
デフォルトでは上記のルートが設定されています。ルートは上から順に評価され、マッチすればそのメソッドが実行されます。
なお、CLI
はコマンドライン用の特殊なルートです。
Discussion