CakePHP2.xで、複数のサービスを運用する

あるあるネタですが、スタートアップや、フリーランスでプログラムを書いてると、

  • ドメインを分けて管理画面を作りたくなった
  • 似たようなサービスを複数作りたくなった

などなど、CakePHPのModelやコンポーネント、ヘルパーなどのリソースを共有したまま、別サイトという形でサービスを立ち上げたいシーンに良く遭遇する。

例えば、「hoge.com」で、サービスの運用をしていて、管理画面を「manage.hoge.com」などといったサブドメインで分けたい場合。

下記、ディレクトリ構成

cake/app/
cake/lib/
cake/plugins/
cake/public/ ←「hoge.com」のドキュメントルート
cake/manage/ ←「manage.hoge.com」のドキュメントルート

とまぁ、こんな感じのディレクトリ構成にして、
サイト別のリソースは「public」「manage」に記述し、
共通で使いたいリソースは「app」に分け管理していきます。

「hoge.com」のドキュメントルート「public」ディレクトリ構成は、

cake/public/Config/
cake/public/Controller/
cake/public/View/
cake/public/tmp/
cake/public/webroot/
.htaccess

基本的に「app」ディレクトリ直下のディレクトリを丸コピでOKです。
.htaccessも「app」直下に存在した.htaccessをコピペでOK。

.htaccessの設定内容は、mod_rewriteを使って、webrootへリライトするのみです。

<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteRule    ^$    webroot/    [L]
    RewriteRule    (.*) webroot/$1    [L]
</IfModule>

これにより、「hoge.com」のドキュメントルートが、
cake/public/webroot/になります。

あとは、ドキュメントルートのindex.phpで、リソースの参照先を変更してあげます。
cake/public/webroot/index.php

App::uses('Dispatcher', 'Routing');
App::build(array('Model' => array(ROOT . DS . 'app' . DS . 'Model' . DS)));
App::build(array('Console' => array(ROOT . DS . 'app' . DS . 'Console' . DS)));
App::build(array('Vendor' => array(ROOT . DS . 'app' . DS . 'Vendor' . DS)));

$Dispatcher = new Dispatcher();
$Dispatcher->dispatch(
	new CakeRequest(),
	new CakeResponse()
);

これで、「hoge.com」ModelとConsoleとVendorのリソースは、
cake/app/直下の、ModelとConsoleとVendorで管理されます。

tmp/や、Configなどはおこのみで♪