Pull to refresh

XML Конфиг под разные хосты

Reading time5 min
Views1.4K
Прочитал статью про конфиг, основная идея – делать конфиг, который не придется менять на локальном компе и на хостинге. В зависимости от того, где запущен сайт будут использоваться специфичные настройки. К сожалению, ссылка не сохранилась, повторно найти не смог. Решил реализовать это наследуя Zend_Config_Xml.


Используя эту идею, конфиг будет выглядеть примерно так:
<?xml version=«1.0» encoding=«UTF-8»?>
<config>
  <base>
    <models>
      <account>Model_Account</account>
    </models>  
    <database>
      <adapter>Pdo_Mysql</adapter>
    </database>
    <site>
      <server></server>
      <root></root>
      <language>ru</language>
      <timezone>Europe/Moscow</timezone>
    </site>
    <debug>4</debug>
  </base>
  <configuration xmlnslocalhost» name=«Home» extends=«base»>
    <database>
      <params>
        <host>localhost</host>
        <dbname>mydb</dbname>
        <username>root</username>
        <password></password>
      </params>
    </database>
  </configuration>
  <configuration xmlnsmysite.com» name=«Hosting» extends=«base»>
    <database>
      <params>
        <host>localhost</host>
        <dbname>mysiteDb</dbname>
        <username>dbUser</username>
        <password>siteDbPassword</password>
      </params>
    </database>
  </configuration>
</config>
* This source code was highlighted with Source Code Highlighter.


Конфигурация base общая для любых условий, чтоб использовать ее, в других конфигурациях она указывается через атрибут extends, этот стандартный способ, который реализуется в Zend_Config_Xml. Атрибут xmlns указывает адрес, для которого будет применяться уже своя конфигурация.

Вот сам класс:
<?php
/**
*
* @package    Mego
* copyright  Copyright © 2006-2008 Alexey Prokhorov
* version    1.0.0.1
*/

/**
* see Zend_Config
*/
require_once 'Zend/Config.php';

/**
* @category  Mego
* @package  Zend_Config
* copyright Copyright © 2006-2008 Alexey Prokhorov
* version    1.0.0.1
* @throws Zend_Config_Exception
*/
class Mego_Config_Xml extends Zend_Config_Xml
{
  /**
   * Загружает данные из XML файла.
   *
   * Расширяет возможности Zend_Config_Xml, добавляя поддержку XML неймспейсов.
   * Удобно для разных доменных имен
   *
   * param string $file
   * param string $namespace XML Неймспейс
   * param bool  $allowModifications
   * @throws Zend_Config_Exception
   */
  public function __construct($file, $namespace = null, $allowModifications = false)
  {
    if (empty($file)) {
      /**
       * see Zend_Config_Exception
       */
      require_once 'Zend/Config/Exception.php';
      throw new Zend_Config_Exception('Filename is not set');
    }
    
    $config = $baseConfig = array();
    
    $baseXml = simplexml_load_file($file);
    if ($namespace) {
      $xml = $baseXml->children($namespace);
      $attrib = $xml->attributes();
      if (isset($attrib['extends'])) {
        $extends = (string) $attrib['extends'];
        $baseConfig = $this->_processExtends($baseXml, $extends);
      }
      if (isset($attrib['name'])) {
        $baseConfig['cfgName'] = (string) $attrib['name'];
      }
      $xml = $xml->children();  
    } else {
       $xml = $baseXml;  
    }
    
    foreach ($xml as $k => $v) {
      $config[$k] = $this->_processExtends($xml, $k);
    }
    
    if (isset($baseConfig)) {
      $config = $this->_arrayMergeRecursive($baseConfig, $config);
    }
    
    $this->_allowModifications = $allowModifications;
    $this->_loadedSection = null;
    $this->_index = 0;
    $this->_data = array();
    foreach ($config as $key => $value) {
      if (is_array($value)) {
        $this->_data[$key] = new Zend_Config($value, $this->_allowModifications);
      } else {
        $this->_data[$key] = $value;
      }
    }
    $this->_count = count($this->_data);
  }
}
* This source code was highlighted with Source Code Highlighter.

Tags:
Hubs:
Total votes 8: ↑5 and ↓3+2
Comments16

Articles