Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何将Zend_Db_表与多个模式和多个部署一起使用?_Php_Zend Framework_Zend Db - Fatal编程技术网

Php 如何将Zend_Db_表与多个模式和多个部署一起使用?

Php 如何将Zend_Db_表与多个模式和多个部署一起使用?,php,zend-framework,zend-db,Php,Zend Framework,Zend Db,我的老板希望我们目前正在开发的应用程序能够在数据库中的多个模式中进行拆分,因为他希望多个应用程序(其中一些我无法控制)能够访问数据,遵循类似DeploymentPrefix\u Category的命名约定。例如,有一些生产模式,production\u-Foo,production\u-Bar和production\u-Baz,然后同样的模式用于stagingstaging\u-Foo,staging\u-Bar和staging\u-Baz,同样的模式用于开发 问题是,虽然Zend_Db_Tab

我的老板希望我们目前正在开发的应用程序能够在数据库中的多个模式中进行拆分,因为他希望多个应用程序(其中一些我无法控制)能够访问数据,遵循类似
DeploymentPrefix\u Category
的命名约定。例如,有一些生产模式,
production\u-Foo
production\u-Bar
production\u-Baz
,然后同样的模式用于staging
staging\u-Foo
staging\u-Bar
staging\u-Baz
,同样的模式用于开发

问题是,虽然
Zend_Db_Table
允许我指定一个模式,但它似乎不允许我动态生成该模式,我需要这样做才能将前缀添加到模式中


处理这个问题的最佳方法是什么?

使用Zend_Config可以轻松处理不同环境的不同配置问题。请参阅快速入门中有关配置的部分:

这允许您为每个环境指定不同的设置

至于模式,我猜您有一些表存在于Production\u Foo中,还有一些表存在于Production\u Bar中。考虑为这些模式中的每一个扩展ZDENBDBYTABLE,并在构造时指向正确的数据库。

Zend_Db_表的构造函数定义如下:

public function __construct($config = array(), $definition = null)
    { ... }
当我们继续查看$definition的位置时,它允许您传递一个加载到Zend_Db_Table_定义中的数组。其中一个选项是表名:

/**
 * @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;
}

至于您的模式,您只需为指向正确模式的db适配器传入不同的选项集。

好吧,我认为对于不同的暂存场景使用不同的表名“Production\u Foo”-“staging\u Foo”-“Testing\u Foo”并不“好”。。。。只是“Foo”更简单、更高效

但无论如何: 就我个人而言,我使用表数据网关(我想这就是它的名称)——使用Zend_Db_Table_抽象扩展,所以我会这样做:

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”,环境前缀为“Production_uu”、“Staging_uu”、“Testing_uu”,等等


尽管如此,你还是开发者,告诉您的上司让大家的生活更轻松^^根据环境的不同,使用不同的表名有很多缺点:\

我们已经使用默认的Zend_应用程序位设置了多个部署--但是我们没有办法将前缀注入表类中的模式引用中。也就是说,不同的Zend_Db_表类必须使用不同的模式检查Zend_Db_表构造函数中的第二个参数。可以将配置对象或数组传递给定义。您可以设置的参数之一是表名:公共函数setTableConfig($tableName,array$tableConfig),我已经在上面添加了对它的引用。简短回答:可能会有帮助。我同意@Sam。这只是一个糟糕的想法。您永远不希望混合来自不同暂存区域的数据。至少,您应该用不同的数据库名称,或者更好的是,不同的主机来分隔暂存区域。您不能这样做,因为类属性必须是常量,也就是说,它必须能够在编译时进行计算,并且不能依赖运行时信息来进行计算。@drew010好的,我现在应该已经知道了。。。我称自己擅长我所做的,叹气:P但是如果你的类扩展zend db table做:
public function\uuu-construct($config){$this->\u-name=zend\u-Registry::get('config')->env\u-tbl\u-prefix.Foo';parent::\uu-construct($config);
应该可以工作,对吧?没关系,我犯过几次这个错误,这就是我现在非常清楚的原因。我看不出像您现在这样在构造函数中更改名称有任何问题,我认为这很好。@Sam:我们不是在讨论不同的表名;我们在谈论不同的图式。您不希望您的开发和登台系统指向生产数据——您的开发盒上的bug不应该能够吹走生产数据。