2011-08-01 6 views
1

私は以下の制約(扱いにくいが制御不能)の対象となる小さなCakePHPアプリケーションを開発中です:2つの同一のデータベースのいずれかで動作する必要があります。例えば:CakePHP - ルートまたはURLに基​​づいてデータベースの設定を選択しますか?

http://www.example.com/myapp/foo/action/param 
http://www.example.com/myapp/bar/action/param 

最初の明白な解決策は、別のデータベース構成でmyapp/foomyapp/bar 2つの同一のCakePHPアプリケーションを有することです。しかし、これはクルージング感がありますので、私は単一のアプリケーションを作成するエレガントな方法を見つけようとしています。

私が検討しているアプローチは次のとおりです。myapp/foomyapp/barが同じコントローラに関連付けられるようなルートを定義します。その後、私のDATABASE_CONFIGクラスにコンストラクタ与える:

function __construct() { 
    $pathParts = explode('/', $_SERVER['REQUEST_URI']); 
    if (array_search('foo', $pathParts)) { 
    $this->default = $this->fooConfig; 
    } else if (array_search('bar', $pathParts)) { 
    $this->default = $this->barConfig; 
    } 
} 

を(。どこもちろん私は2つのデータベースのためのfooConfigbarConfigを定義しました)私は、URLのコントロールを持っているので、私はそこではないと確信することができURLにfooまたはbarの無関係の出現がある

私の質問は次のとおりです。この奇妙な状況を処理する、よりシンプルで洗練された方法がありますか?多分AppModelおよび/またはAppControllerの何か?重複したコードを取り除いていますが、あるコードのにおいを別のコードに置き換えるという感覚を揺さぶることはできません。

答えて

1

これを行うにはいくつかの方法がありますが、ここには1つあります。

あなたが常に一致している甘いカスタムルートを書く:

Router::connect('/:ds/*', array(), array('routeClass' => 'SweetDbRoute'));

はその後SweetDbRoutesがあなたのモデルコンストラクタを含め、どこでも使用することができますクラス変数を設定しています。その後、実際にリクエストを調整しないように失敗するはずです。次に、あなたのAppModelで

App::import('SweetDbClass', array('file' => '/path/to/your/sweet_db_class.php')); 
class SweetDbRoute extends CakeRoute { 
    // put your failing route code here, but use your SweetDbClass to track datasource ... 
    // see http://book.cakephp.org/view/1634/Custom-Route-classes 
} 

App::import('SweetDbClass', array('file' => '/path/to/your/sweet_db_class.php')); 
    class AppModel extends Model { 
    public function __construct($id = false, $table = null, $ds = null) { 
     $ds = SweetDbClass::$ds; 
     parent::__construct($id, $table, $ds); 
    } 
} 
+0

また、Model :: setDataSource() –

+0

+1のようなデータソースの操作に役立つさまざまな方法をスイートコードで見つけることができます。私はこれを使って遊びます。 (また...歓迎!) – eaj

+0

これは結局私に合理的な解決に導いた、ありがとう。 – eaj

0

たとえば、1つのデータベースで挿入を実行した後、2つのデータベースが「同一」になることはありません。これら2つのDBはどういうわけかお互いに同期していますか?私はそれらのDBで何をする必要があるのか​​分かりませんが、2つの別々のアプリケーションを行うほうが簡単でしょう。

はい、モデルにhttp://book.cakephp.org/view/922/Database-ConfigurationのDB設定を指定できますが、その場で変更することはできません(モデルによって別のテーブルとの関連付けが変更されることはありません)。おそらく唯一の方法です。

私はURLを制御を持っているので、私ははい、FOOの「異質の出現が可能URLに

FOOやバーの余分な発生がないことを確信することができあなたのアプリを壊すことはありません。

+0

さて、私は何を意味するのかは、データベースが同一のスキーマを持っているということでした。 :) – eaj

関連する問題