サイトの設計上、管理画面と公開画面をサブドメインで分けることになりました。
とは言え、Vendorやモデルは共有したので、ちょっとCakePHPの設定をいじらないといけません。
ControllerとViewだけを切り分けて、他のファイルを共通化するというのが一番いいのかな?
フォルダ構成はこんな感じになりました。
root
├cake
│├app
│└cake
├www.example.com(公開用)
│└public_html
└admin.example.com(管理用)
└public_html
各public_htmlフォルダのindex.phpで、「ROOT」と「APP_DIR」と「CAKE_CORE_INCLUDE_PATH」の定数を設定します。
今回の場合は以下のようになりました。
if (!defined('ROOT')) {
define('ROOT', dirname(dirname(dirname(__FILE__))).DS.'cake');
}
if (!defined('APP_DIR')) {
define('APP_DIR', 'app');
}
if (!defined('CAKE_CORE_INCLUDE_PATH')) {
define('CAKE_CORE_INCLUDE_PATH', dirname(dirname(dirname(__FILE__))).DS.'cake'.DS.'cake'.DS.'lib');
}
そして、ファイル管理をしやすくする為に root/cake/appのControllerとViewをフォルダで区切ります
app
├Controller
│├admin
│└www
└View
├admin
└www
フォルダを区切るだけでは認識されないので、 app/Config/bootstrap.php に以下のコードを追記します。
App::build(array(
'Controller' => array (
ROOT.DS.APP_DIR.DS.'Controller'.DS.'admin'.DS,
ROOT.DS.APP_DIR.DS.'Controller'.DS.'www'.DS
),
'View' => array (
ROOT.DS.APP_DIR.DS.'View'.DS.'admin'.DS,
ROOT.DS.APP_DIR.DS.'View'.DS.'www'.DS
)
));
これで、Modelを共有して複数のサブドメインから1つのCakePHPを参照することができます。
問題点は、フォルダで区切るから、同じ名前のコントローラー名をつけることができてしまうってことかな。
adminとwwwにPagesController.phpを作ってしまうとどちらか(多分adminの方)を読み込んで、片方は読まれません。
なので、この方法でやる場合はcontrollerの重複に気を付けないといけない感じです。
あと、app/routes.phpで調整してドメインごとにトップページのコントローラーを変える等の調整が必要です。
例えば、AdminPagesController.php をadmin.example.comのルートに設定する場合、
$host = explode('.', $_SERVER['HTTP_HOST']);
switch ($host[0]) {
case 'admin':
Router::connect('/', array('controller' => 'admin_pages', 'action' => 'display', 'home'));
break;
default:
Router::connect('/', array('controller' => 'pages', 'action' => 'display', 'home'));
break;
}
こんな感じでいいんじゃないかな。
ルーティングしてしまえばURLは何とでもなるし、adminフォルダならファイル名の接頭語にadminを付けるとかして工夫した方が安全ですね。