2011-09-29 40 views
0

我的老闆希望我們目前正在使用的應用程序在數據庫中的多個模式中分離,因爲他希望多個應用程序(其中一些我無法控制)能夠在命名後訪問數據大會像DeploymentPrefix_Category。例如,生產中會有一些模式,Production_Foo,Production_BarProduction_Baz,然後分階段Staging_FooStaging_BarStaging_Baz,以及相同的開發。如何在多個模式和多個部署中使用Zend_Db_Table?

問題是,儘管Zend_Db_Table允許我指定一個模式,但似乎並不讓我在運行中生成該模式,我需要將該前綴放在模式上。

處理這個問題的最佳方法是什麼?

+0

簡短回答:也許[this](http://stackoverflow.com/questions/4437782/zend-framework-database-table-field-prefix-like-users-us-name)將幫助。 – nevvermind

回答

1

Zend_Config很容易處理不同配置的問題。請參閱快速入門配置上一節:

http://framework.zend.com/manual/en/learning.quickstart.create-project.html

這使您可以爲每個環境指定不同的設置。

至於模式,我猜你有一些生活在Production_Foo和其他生活在Production_Bar中的表。考慮爲這些模式中的每一個擴展Zend_Db_Table,並在構建時指向正確的數據庫。

Zend_Db_Table類的構造函數定義如下:

public function __construct($config = array(), $definition = null) 
    { ... } 

當我們跟進,看看$定義導致它允許您通過加載到Zend_Db_Table_Definition數組。其中一個爲這個選項是表名:

/** 
* @param string $tableName 
* @param array $tableConfig 
* @return Zend_Db_Table_Definition 
*/ 
public function setTableConfig($tableName, array $tableConfig) 
{ 
    // @todo logic here 
    $tableConfig[Zend_Db_Table::DEFINITION_CONFIG_NAME] = $tableName; 
    $tableConfig[Zend_Db_Table::DEFINITION] = $this; 

    if (!isset($tableConfig[Zend_Db_Table::NAME])) { 
     $tableConfig[Zend_Db_Table::NAME] = $tableName; 
    } 

    $this->_tableConfigs[$tableName] = $tableConfig; 
    return $this; 
} 

至於你的模式,你只是通過不同的一套指向正確的數據庫適配器選項。

+0

我們已經使用默認的Zend_Application位設置了多個部署 - 我們沒有將表頭注入表類中的模式引用的方法。 –

+0

也就是說,不同的Zend_Db_Table類必須使用不同的模式 –

+0

檢查Zend_Db_Table構造函數中的第二個參數。您可以將配置對象或數組傳遞給定義。你可以設置的參數之一是表名: 公共函數setTableConfig($ tableName,array $ tableConfig) –

1

那麼我會爭辯說,爲不同的臨時場景使用不同的表名「Production_Foo」 - 「Staging_Foo」 - 「Testing_Foo」....只是「Foo」更容易和更多生產...

但不管怎麼說: 我個人使用的表的數據網關(我想這就是它叫什麼) - 使用Zend_Db_Table_Abstract擴展,所以我會做這樣的:

class Application_Model_DbTable_Foo extends Zend_Db_Table_Abstract 
{ 
    public function __construct($config = array()) { 
    $this->_name = Zend_Registry::get('config')->env_tbl_prefix.'Foo'; 
    parent::__construct($config); 
    } 
} 

顯然這需要您將配置存儲到註冊表中並在配置中使用您的環境前綴定義密鑰「env_tbl_prefix」 s「Production_」,「Staging_」,「Testing_」等...

不過,你是開發者,告訴你的老闆讓生活更輕鬆^^使用不同的表名取決於環境:\

+0

我同意@Sam。這只是一個可怕的想法。你永遠不想混合來自不同臨時區域的數據。至少應該用不同的數據庫名稱來區分登臺區域,或者更好的是使用不同的主機。 –

+2

你不能這樣做,因爲類屬性必須是常量,也就是說,它必須能夠在編譯時進行評估,並且不能依賴運行時信息來進行評估。 – drew010

+0

@ drew010好吧,我現在應該知道了......並且我稱自己擅長我所做的,感嘆:P但是,如果你的類擴展了zend數據庫表:'public function __construct($ config){$ this- > _name = Zend_Registry :: get('config') - > env_tbl_prefix.'Foo';父:: __結構($配置); }'應該工作,對吧? – Sam

相關問題