【问题标题】:How do I use Zend_Db_Table with multiple schemata and multiple deployments?如何将 Zend_Db_Table 与多个模式和多个部署一起使用?
【发布时间】:2011-09-30 03:24:35
【问题描述】:

我的老板希望我们目前正在开发的应用程序在数据库中拆分为多个模式,因为他希望多个应用程序(其中一些我无法控制)能够访问数据,遵循命名约定如DeploymentPrefix_Category。例如,有一些用于生产的模式,Production_FooProduction_BarProduction_Baz,然后用于暂存Staging_FooStaging_BarStaging_Baz,同样用于开发.

问题在于,虽然Zend_Db_Table 让我指定一个架构,但它似乎不允许我即时生成该架构,我需要这样做才能将该前缀放在架构上。

最好的处理方法是什么?

【问题讨论】:

  • 简答:也许this 会有所帮助。

标签: php zend-framework zend-db


【解决方案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;
}

至于您的架构,您只需为指向正确的数据库适配器传递一组不同的选项。

【讨论】:

  • 我们已经使用默认的 Zend_Application 位设置了多个部署——尽管我们没有办法将前缀注入到表类中的模式引用中。
  • 即不同的 Zend_Db_Table 类必须使用不同的模式
  • 检查 Zend_Db_Table 的构造函数中的第二个参数。您可以将配置对象或数组传递给定义。您可以设置的参数之一是表名: public function setTableConfig($tableName, array $tableConfig)
  • 我在上面添加了对这个的引用。
【解决方案2】:

好吧,我认为对于不同的暂存场景“Production_Foo”-“Staging_Foo”-“Testing_Foo”使用不同的表名并不是“好”......只是“Foo”更容易和更有效率...

但无论如何: 我个人使用 Table-Data-Gateway(我猜这就是它的名字) - 使用 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”,并使用您的环境前缀“Production_”、“Staging_”、“Testing_”等...

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

【讨论】:

  • 我同意@Sam。这只是一个可怕的想法。您永远不想混合来自不同暂存区域的数据。至少,您应该使用不同的数据库名称分隔暂存区域,或者更好的是,使用不同的主机。
  • 您不能这样做,因为类属性必须是常量,也就是说,它必须能够在编译时进行评估,并且不能依赖运行时信息才能进行评估。
  • @drew010 好的,我现在应该知道了......我称自己擅长我所做的事情,叹息:P 但是如果你的课程扩展了 zend db 表做:public function __construct($config) { $this->_name = Zend_Registry::get('config')->env_tbl_prefix.'Foo'; parent::__construct($config); } 应该工作对吧?
  • 没关系,我犯过几次这个错误,这就是为什么我现在如此了解它的原因。像现在这样在构造函数中更改名称没有任何问题,我认为这很好。
  • @Sam:我们不是在谈论不同的表名;我们正在谈论不同的模式。你不希望你的开发和登台系统指向生产数据——你的开发箱上的一个错误不应该能够摧毁生产数据。
猜你喜欢
  • 1970-01-01
  • 2021-10-10
  • 2020-12-17
  • 2011-05-21
  • 1970-01-01
  • 1970-01-01
  • 2016-12-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多