CodeIgniter 4.2.0 で導入された新しい自動ルーティングについて

CodeIgniter 4.2.0 がリリースされ、それと共に新しい自動ルーティング機能が導入されました。

Version 4.2.0 — CodeIgniter 4.2.0 documentation

CodeIgniter 3.0 ~ 4.1.9 スタイルの自動ルーティングは確かに Symfony や Laravel などと比べるとGETやPOSTなどHTTPメソッドを区別したルーティングは行われておらず、ゆるい分例えばPOSTを想定した処理にGETでアクセスしてCSRF対策を回避できる可能性などが有りました(もっともPOST専用のコントローラメソッドならPOST以外をはじくような処理を今まで書いていたとは思います。書いていますよね?)。

CodeIgniter 4.2.0 で新しく導入された新自動ルーティング機能ではこの辺りを改め、POSTでアクセスするべき処理はPOSTで動く事を明確にするような改修が行われています。

ただ、ここで旧自動ルーティングを利用している場合に、新自動ルーティングに移行した場合と設定ファイルでのルーティング(自動ルーティング機能オフ)に移行した方が良いかのポイントが有ったのでここに残しておきます。

既に設定ファイルを使ってルーティングしている場合

設定ファイルのままで問題有りません。設定ファイルで定義するのが結局最も意図しない動きが起きない(=安全)な実装になります。

大文字小文字を区別するURLを構成している

自動ルーティングを利用する場合クラス名は先頭のみが大文字である事が求められます。大文字が含まれるURLを構成している場合はそこにクラス名をフィットさせられないので、設定ファイルでルーティングしましょう。

_remap でのルーティングを行っている

新自動ルーティングではコントローラーメソッドとURL(URI)の関係を1対1とするために_remapでのルーティング調整が廃止されています。設定ファイルでのルーティングに移行しそちらでカバーしましょう。

同じコントローラメソッド内でHTTPメソッドによる分岐を行っている

設定ファイルでのルーティングに移行しましょう。設定ファイルのルーティングであればGETとPOSTを両方同じコントローラメソッドで受け付けるようなルーティングが可能です。

ここまでどれも該当しない場合

新自動ルーティングを使っても良いですし、設定ファイルに移行してもどちらでもいいと思います。

設定ファイルに移行する場合

旧自動ルーティング・新自動ルーティング・設定ファイルでのルーティングのいずれを利用している場合においても、以下のコマンドを実行することで既存のルーティングを一覧表示する事が出来ます。

php spark routes

ここで出力されたルート一覧をExcelやスプレッドシートに貼り付け、区切り文字を | に設定し列に分割、移行リストとして1つ1つ設定に移植してきましょう。この際、旧自動ルーティングは <クラス名>::__construct や <クラス名>::index も(旧自動ルーティングでは有効な)ルートとして出力してきます。前者を削除し、後者も不要であればリストから削除しましょう。残りが設定ファイルへ移植するべきルーティングです。

設定ファイルへの移行が済んだら自動ルーティングの設定を無効化しましょう。コントローラメソッド内で目的のHTTPメソッド以外をはじくような処理を入れている場合、今後はデッドコードになるので併せて削除してもいいと思います。