CakePHPでコントローラーを複数のディレクトリに整理する方法

大規模な開発に向いているといわれているsymfonyディレクトリ構造が最初から3階層に分類されています。アプリケーションの規模が大きくなるにつれて増えていくファイルを整理する為のルールが最初から定められている形です。

 project/
   +-apps/
      +-backend/
      +-frontend/
          +-modules/
              +-HogeModule
              +-FugaModule
              +-MogeModule
                  +-actions/ ←実際のコントローラー(アクション)はここに追加する

対するCakePHPはこういった階層は無く、コントローラーは controllersディレクトリにフラットに配置されています。ディレクトリがシンプルな分、把握しやすいとも言えますが規模が大きいアプリケーションの場合にコントローラーの数が増えすぎると扱い辛いという問題が起こります。

しかし実は簡単な設定を行う事でコントローラー等を複数のディレクトリに整理する事が出来ます。

remoraのアプリケーションを例にとってみるとcontrollersの下はこんな事になっています。

Image4

ちょっと数が多いのでなんとなく分類して admin user develop のディレクトリをcontrollersの下に作り、ファイルを移動します。特に命名ルールなどはありませんのでファイル名やクラス名を変更する必要はありません。

Image6

次に作成したディレクトリの中からCakePHPがコントローラーを利用できるように app/config/bootstrap.php 内に設定を追加します。

/**
 * The settings below can be used to set additional paths to models, views and controllers.
 * This is related to Ticket #470 (https://trac.cakephp.org/ticket/470)
 *
 * $modelPaths = array('full path to models', 'second full path to models', 'etc...');
 * $viewPaths = array('this path to views', 'second full path to views', 'etc...');
 * $controllerPaths = array('this path to controllers', 'second full path to controllers', 'etc...');
 *
 */
$controllerPaths = array(
  ROOT.DS.APP_DIR.DS.'controllers'.DS.'user'.DS,
  ROOT.DS.APP_DIR.DS.'controllers'.DS.'admin'.DS,
  ROOT.DS.APP_DIR.DS.'controllers'.DS.'develop'.DS,
  ROOT.DS.APP_DIR.DS.'controllers'.DS,
);

設定ファイル内にコメントで使用方法が書いてありますが、 $controllerPathsにコントローラーがおいてあるディレクトリを配列で指定すればOKです。これで問題なく動作するようになりました。windowsLinuxで動作するようにDS定数を使って書いているので少し見づらいですが、フルパスでディレクトリを指定するのみです。
設定方法を見るとわかりますが、そもそも controllersの下でなくとも自由な場所を設定する事ができそうです。また同じようにModelやViewの配置場所も追加設定ができるのでこれらも整理したい場合は設定を行う事が出来ます。

特に命名ルールなどがないので移動するだけでよいですが、分散したディレクトリ内でファイル名やクラス名が衝突すると面倒な事になると思われますので接頭語を付けるなどして管理するのが良いかもしれません。
コントローラーなどが増えてきて困っている方は試してみてはどうでしょうか。


参考にさせていただいたエントリー