TigerZF
🌐Español

21.5. Zend_Config_Xml

Zend_Config_Xml permite a los desarrolladores almacenar datos de configuración en un formato XML simple y leerlos mediante sintaxis de propiedades de objetos anidados. El elemento raíz del archivo o cadena XML es irrelevante y puede nombrarse de forma arbitraria. El primer nivel de elementos XML corresponde a las secciones de datos de configuración. El formato XML soporta organización jerárquica mediante el anidamiento de elementos XML por debajo de los elementos de nivel de sección. El contenido de un elemento XML de nivel hoja corresponde al valor de un dato de configuración. La herencia de secciones se soporta mediante un atributo XML especial llamado extends, y el valor de este atributo corresponde a la sección de la cual la sección que extiende heredará los datos.

[Note] Tipo de retorno

Los datos de configuración leídos en Zend_Config_Xml siempre se devuelven como cadenas. La conversión de datos de cadenas a otros tipos se deja a los desarrolladores para que se adapte a sus necesidades particulares.

Ejemplo 21.4. Uso de Zend_Config_Xml

Este ejemplo ilustra un uso básico de Zend_Config_Xml para cargar datos de configuración desde un archivo XML. En este ejemplo hay datos de configuración tanto para un sistema de producción como para un sistema de staging. Debido a que los datos de configuración del sistema de staging son muy similares a los de producción, la sección de staging hereda de la sección de producción. En este caso, la decisión es arbitraria y podría haberse escrito al revés, con la sección de producción heredando de la sección de staging, aunque esto puede no ser así para situaciones más complejas. Suponga, entonces, que los siguientes datos de configuración están contenidos en /path/to/config.xml:

<?xml version="1.0"?>
<configdata>
    <production>
        <webhost>www.example.com</webhost>
        <database>
            <adapter>pdo_mysql</adapter>
            <params>
                <host>db.example.com</host>
                <username>dbuser</username>
                <password>secret</password>
                <dbname>dbname</dbname>
            </params>
        </database>
    </production>
    <staging extends="production">
        <database>
            <params>
                <host>dev.example.com</host>
                <username>devuser</username>
                <password>devsecret</password>
            </params>
        </database>
    </staging>
</configdata>

A continuación, suponga que el desarrollador de la aplicación necesita los datos de configuración de staging del archivo XML. Es sencillo cargar estos datos especificando el archivo XML y la sección de staging:

$config = new Zend_Config_Xml('/path/to/config.xml', 'staging');

echo $config->database->params->host;   // prints "dev.example.com"
echo $config->database->params->dbname; // prints "dbname"

Ejemplo 21.5. Uso de atributos de etiqueta en Zend_Config_Xml

Zend_Config_Xml también soporta dos formas adicionales de definir nodos en la configuración. Ambas hacen uso de atributos. Dado que los atributos extends y value son palabras clave reservadas (la segunda por la segunda forma de usar atributos), no pueden usarse. La primera forma de hacer uso de atributos es agregar atributos en un nodo padre, que luego se traducirán en hijos de ese nodo:

<?xml version="1.0"?>
<configdata>
    <production webhost="www.example.com">
        <database adapter="pdo_mysql">
            <params host="db.example.com" username="dbuser" password="secret"
                    dbname="dbname"/>
        </database>
    </production>
    <staging extends="production">
        <database>
            <params host="dev.example.com" username="devuser"
                    password="devsecret"/>
        </database>
    </staging>
</configdata>

La otra forma no acorta realmente la configuración, pero es más fácil de mantener ya que no tiene que escribir el nombre de la etiqueta dos veces. Simplemente crea una etiqueta vacía con el valor en el atributo value:

<?xml version="1.0"?>
<configdata>
    <production>
        <webhost>www.example.com</webhost>
        <database>
            <adapter value="pdo_mysql"/>
            <params>
                <host value="db.example.com"/>
                <username value="dbuser"/>
                <password value="secret"/>
                <dbname value="dbname"/>
            </params>
        </database>
    </production>
    <staging extends="production">
        <database>
            <params>
                <host value="dev.example.com"/>
                <username value="devuser"/>
                <password value="devsecret"/>
            </params>
        </database>
    </staging>
</configdata>

[Note] Cadenas XML

Zend_Config_Xml es capaz de cargar directamente una cadena XML, como la recuperada de una base de datos. La cadena se pasa como primer parámetro al constructor y debe comenzar con los caracteres '<?xml':

$string = <<<EOT
<?xml version="1.0"?>
<config>
    <production>
        <db>
            <adapter value="pdo_mysql"/>
            <params>
                <host value="db.example.com"/>
            </params>
        </db>
    </production>
    <staging extends="production">
        <db>
            <params>
                <host value="dev.example.com"/>
            </params>
        </db>
    </staging>
</config>
EOT;

$config = new Zend_Config_Xml($string, 'staging');
[Note] Espacio de nombres XML de Zend_Config

Zend_Config viene con su propio espacio de nombres XML, que agrega funcionalidad adicional al proceso de análisis. Para aprovecharlo, debe definir un espacio de nombres con el URI de espacio de nombres http://framework.zend.com/xml/zend-config-xml/1.0/ en el nodo raíz de su configuración.

Con el espacio de nombres habilitado, ahora puede usar constantes de PHP dentro de sus archivos de configuración. Además, el atributo extends se trasladó al nuevo espacio de nombres y está obsoleto en el espacio de nombres NULL. Se eliminará por completo allí en Zend Framework 2.0.

$string = <<<EOT
<?xml version="1.0"?>
<config xmlns:zf="http://framework.zend.com/xml/zend-config-xml/1.0/">
    <production>
        <includePath>
            <zf:const zf:name="APPLICATION_PATH"/>/library</includePath>
        <db>
            <adapter value="pdo_mysql"/>
            <params>
                <host value="db.example.com"/>
            </params>
        </db>
    </production>
    <staging zf:extends="production">
        <db>
            <params>
                <host value="dev.example.com"/>
            </params>
        </db>
    </staging>
</config>
EOT;

define('APPLICATION_PATH', dirname(__FILE__));
$config = new Zend_Config_Xml($string, 'staging');

echo $config->includePath; // Prints "/var/www/something/library"