※ 追記
この記事を書いてからしばらくして、単純に model だけであれば一方を主として他方から include()
すればOKということに気づきました。
<?php
include (dirname(dirname(dirname(dirname(__FILE__)))) . '/app/classes/model/modalname.php');
追記ここまで※
この記事の趣旨
FuelPHP で複数サイトを作る場合、通常は fuel/app
レベルで分かれて、fuel/app
, fuel/app_admin
... のようになってしまうので、下層の Model等のファイル類が冗長になります。全く別のサイトであれば問題無いのですが、フロントサイトと管理サイトなど同じサービスにいくつかの顔を作ってそれぞれにドメインをあてる場合などに問題となります。調べると、Modelのディレクトリをシンボリックリンクで共有するなどの方法が知られているようですが、各環境の構築手順が重たくなります。
今回は routes.php をサイト毎に切り換える形で抜本的に対応し、個人的には文句のない快適な状態になりました。
以下に例として、構築中のフロントサイトに別ドメインの管理サイトを共存させる方法を挙げます。
手順
1. public ディレクトリをサイト数分作成する。
/public
をコピーして /public_admin
を作成します。
2. ウェブサーバでサイトの定義をする
http://example.com のドキュメントルートを /public
、
http://example-admin.com のドキュメントルートを /public_admin
と設定します。
3. ドキュメントルート直下の index.php
に定数 ROUTS_FILENAME を定義する
define('ROUTS_FILENAME', 'routes.front.php');
define('ROUTS_FILENAME', 'routes.admin.php');
4. サイト毎の routes.php
を作成する
<?php
// フロントサイト用の routes.php
return array(
'_root_' => 'index', // The default route
'_404_' => 'index/404', // The main 404 route
'admin(.*)' => 'index/404', // controller_admin へのアクセスを防ぐ
);
<?php
// 管理サイト用の routes.php
return array(
'_root_' => 'admin/index', // The default route
'_404_' => 'admin/404', // The main 404 route
'(.+)' => 'admin/$1' // すべて controller_admin 以下にアクセスする
);
5. 本来の routes.php
では4で作ったファイルを読むように記載する
<?php
return include ROUTS_FILENAME;
6. コントローラ等を実装する
http://example.com にアクセスすると app/classes/controller/index.php
が使われ
http://example-admin.com にアクセスすると app/classes/controller/admin.php
が使われます。
注意点
controller が共通なので切り分けはきっちりするべきです。例ではフロントサイトでいかなるURLにアクセスしても管理用のコントローラーに繋がらないようにしています。