Codeigniterのコントローラはサブディレクトリを作ることで、対応するURLも階層が一つ下がります。
大規模なサイトを作成している場合、この機能を使って管理画面側はmanagementディレクトリに、表のサイト部分はcontrollersディレクトリ直下に、みたいなURLルーティングをしているケースも多いでしょう。
しかし、
- 階層レベルが揃っていないと気持ち悪い
- 直下に置いてあるコントローラの別バージョンをサブディレクトリに収めておき、場合によってはそちらを直下のコントローラとして振舞わせたい
なんて理由でサブディレクトリをhttps://○○○.com/コントローラ名/メソッド名/パラメータ
といったURLでアクセスできるメインディレクトリにしたい場合があるかもしれません。
じゃあどうしましょ?
コントローラごとにURIルーティングを設定するのは保守性がよろしくない
frontという名前のディレクトリがapplication/controllers下にあって、それをメインディレクトリとする場合を考えてみましょう。
URI ルーティング — CodeIgniter 3.2.0-dev ドキュメント
この公式ドキュメントに記載されている方法を使えばワイルドカードおよび正規表現でURLの再マッピングが可能です。
ただ、この機能を使用してサブディレクトリにあるコントローラをマッピングするには、
//"controllers/front/"にHoge.php, Fuga.php, Piyo.phpというあるコントローラがあるとする
//これらを"controllers/"にあるかのようにマッピングする
$route['hoge(.*)'] = 'front/hoge$1';
$route['fuga(.*)'] = 'front/fuga$1';
$route['piyo(.*)'] = 'front/piyo$1';
のように、コントローラごとに規則を追加する必要があります。
後でコントローラの追加や削除があった場合にいちいちroutes.php
を編集するのは効率が悪いし、別の開発者が「なんかよくわからんけど、frontディレクトリにぶち込んでおけばOKじゃないの??????」となる可能性が高いでしょう。
この部分を自動化する必要がありそうです。
ここはPHPさんにひと肌脱いでもらいましょう。
PHPにサブディレクトリ内を調べてもらい、動的にルーティング規則を作成
routes.php
に以下を追記。
//controllers直下として振舞わせるサブディレクトリ名
$main_directory = 'front';
//サブディレクトリにある.php拡張子が付いたファイルを探してマッピング
$paths = scandir(APPPATH.'controllers/'.$main_directory);
foreach ($paths as $path)
{
$info = pathinfo($path);
if ($info['extension'] === 'php')
{
$name = lcfirst($info['filename']);
$route[$name.'(.*)'] = $main_directory.'/'.$name.'$1';
}
}
こうすれば指定したサブディレクトリに放り込んだphpファイルの名前が自動的にマッピングされ、いちいちroutes.php
を編集する必要がなくなります。あら楽ちん。