我的老板希望我们当前正在处理的应用程序分散在数据库中的几个模式中,因为他想要多个应用程序 - 其中一些我无法控制 - 能够访问数据,命名惯例,如DeploymentPrefix_Category
。例如,有一些用于制作的模式,Production_Foo
,Production_Bar
和Production_Baz
,然后用于暂存Staging_Foo
,Staging_Bar
,和Staging_Baz
,以及发展相同。
问题在于虽然Zend_Db_Table
允许我指定一个模式,但它似乎不允许我动态生成该模式,我需要这样做才能将该前缀放在模式上。
处理这个问题的最佳方法是什么?
答案 0 :(得分: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)
{ ... }
当我们查看$ definition引导的位置时,它允许您传递一个加载到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;
}
对于您的架构,您只需为数据库适配器传递指向正确的选项的不同选项集。
答案 1 :(得分: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);
}
}
显然,这需要您将配置存储到注册表和配置内部,以使用您的环境前缀“Production_”,“Staging_”,“Testing_”等来定义密钥“env_tbl_prefix”...
不过,你是开发人员,告诉你的老板让所有人的生活更轻松^^根据环境使用不同的表名有很多缺点:\