🔥

CodeIgniter4のルーティング

2021/12/10に公開

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/usersadmin/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