2011-08-01 53 views
1

我正在處理一個小的CakePHP應用程序,該應用程序受到以下約束(很尷尬,但超出了我的控制範圍):我需要它在兩個相同的數據庫中任一個上工作,並且選擇基於URL。例如:CakePHP - 選擇基於路由或url的數據庫配置?

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

第一個明顯的解決方案是讓在myapp/foo和兩條相同的CakePHP應用myapp/bar與不同的數據庫配置。儘管如此,我仍然覺得這很有趣,所以我試圖找到創建單個應用程序的優雅方式。

我正在考慮的方法是:定義路線,使myapp/foomyapp/bar將與相同的控制器相關聯。然後給我DATABASE_CONFIG類的構造函數:(這裏當然我已經定義了兩個數據庫fooConfigbarConfig

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; 
    } 
} 

我有過的URL控制,所以我可以確信不會有在URL中多出現foobar

我的問題是:是否有更簡單,更優雅的方式來處理這種奇怪的情況?或許在AppModel和/或AppController?雖然我擺脫了重複的代碼,但我不能動搖我用另一種代碼替換一種代碼氣味的感覺。

回答

1

有幾種方法可以做到這一點,這裏有一個。

寫甜蜜的定製路線,你總是一致的:

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

然後有SweetDbRoutes設置就可以使用的地方,包括你的模型構造類變量。那麼它會失敗,所以你實際上並沒有調整請求。

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 
} 

然後在您的AppModel:

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

因此,例如,在一個數據庫中執行插入操作後,兩者不會「相同」,對吧?這兩個數據庫是否以某種方式彼此同步?我不知道你需要在這些數據庫上做什麼,但是做2個獨立的應用程序可能更容易。

是的,您可以在模型中指定數據庫配置:http://book.cakephp.org/view/922/Database-Configuration,但您不能即時更改它(模型預計不會改變到另一個表的關聯,我想)。你做什麼可能是唯一的方法。

我有過的URL控制,所以我可以確信不會有富或酒吧的外來出現在URL

是的,有可能是「富的外部事件或者在網址欄中輸入「:))但它不會破壞你的應用程序。

+0

好吧,我的意思是,數據庫具有相同的架構。 :) – eaj