Как использовать Zend_Db_Table с несколькими схемами и несколькими развертываниями? - PullRequest
0 голосов
/ 29 сентября 2011

Мой босс хочет, чтобы приложение, над которым мы сейчас работаем, было разделено на несколько схем в базе данных, потому что он хочет, чтобы несколько приложений - некоторые из которых я не могу контролировать - имели возможность доступа к данным после соглашение об именах, например DeploymentPrefix_Category. Например, будет несколько схем для производства, Production_Foo, Production_Bar и Production_Baz, а затем то же самое для постановки Staging_Foo, Staging_Bar и Staging_Baz, и то же самое для разработки .

Проблема заключается в том, что, хотя Zend_Db_Table позволяет мне указать схему, похоже, она не позволяет мне генерировать эту схему на лету, что мне нужно было бы сделать, чтобы добавить этот префикс в схему.

Какой лучший способ справиться с этим?

Ответы [ 2 ]

1 голос
/ 29 сентября 2011

Ну, я бы сказал, что нехорошо иметь разные имена таблиц для разных сценариев постановки «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" с префиксами вашей среды "Production_", "Staging_", "Testing_" и т. Д. *

Тем не менее, вы разработчик, скажите своему боссу, чтобы облегчить жизнь всем вам ^^ Есть много недостатков в использовании разных имен таблиц в зависимости от среды: \

1 голос
/ 29 сентября 2011

Проблема различных конфигов для разных сред легко решается с помощью 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;
}

Что касается вашей схемы, вы просто передаете другой набор параметров для адаптера db, который указывает на правильный.

...