LoginSignup
7
5

More than 5 years have passed since last update.

Codeigniterでサブディレクトリに配置したコントローラを直下に置いたかのようにルーティングする

Last updated at Posted at 2017-10-17

Codeigniterのコントローラはサブディレクトリを作ることで、対応するURLも階層が一つ下がります。
大規模なサイトを作成している場合、この機能を使って管理画面側はmanagementディレクトリに、表のサイト部分はcontrollersディレクトリ直下に、みたいなURLルーティングをしているケースも多いでしょう。

しかし、

  • 階層レベルが揃っていないと気持ち悪い
  • 直下に置いてあるコントローラの別バージョンをサブディレクトリに収めておき、場合によってはそちらを直下のコントローラとして振舞わせたい

なんて理由でサブディレクトリをhttps://○○○.com/コントローラ名/メソッド名/パラメータといったURLでアクセスできるメインディレクトリにしたい場合があるかもしれません。

じゃあどうしましょ?

コントローラごとにURIルーティングを設定するのは保守性がよろしくない

frontという名前のディレクトリがapplication/controllers下にあって、それをメインディレクトリとする場合を考えてみましょう。

URI ルーティング — CodeIgniter 3.2.0-dev ドキュメント

この公式ドキュメントに記載されている方法を使えばワイルドカードおよび正規表現でURLの再マッピングが可能です。

ただ、この機能を使用してサブディレクトリにあるコントローラをマッピングするには、

routes.php
//"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に以下を追記。

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を編集する必要がなくなります。あら楽ちん。

7
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
5