Zend_Config_Xml
enables developers to store configuration data in a
simple XML format and read them via nested object property syntax. The
root element of the XML file or string is irrelevant and may be named
arbitrarily. The first level of XML elements correspond with
configuration data sections. The XML format supports hierarchical
organization through nesting of XML elements below the section-level
elements. The content of a leaf-level XML element corresponds to the
value of a configuration datum. Section inheritance is supported by a special
XML attribute named extends, and the value of this
attribute corresponds with the section from which data are to be inherited by the extending
section.
Return Type
Configuration data read into Zend_Config_Xml
are always returned
as strings. Conversion of data from strings to other types is left to developers to
suit their particular needs.
Example 121. Using Zend_Config_Xml
This example illustrates a basic use of Zend_Config_Xml
for
loading configuration data from an XML file. In this example there
are configuration data for both a production system and for a staging system. Because
the staging system configuration data are very similar to those for production, the
staging section inherits from the production section. In this case, the decision is
arbitrary and could have been written conversely, with the production section
inheriting from the staging section, though this may not be the case for more complex
situations. Suppose, then, that the following configuration data are contained in
/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>
Next, assume that the application developer needs the staging configuration data from the XML file. It is a simple matter to load these data by specifying the XML file and the staging section:
$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"
Example 122. Using Tag Attributes in Zend_Config_Xml
Zend_Config_Xml
also supports two additional ways of defining
nodes in the configuration. Both make use of attributes. Since the
extends and the value attributes are reserved
keywords (the latter one by the second way of using attributes), they may not be
used. The first way of making usage of attributes is to add attributes in a parent
node, which then will be translated into children of that node:
<?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>
The other way does not really shorten the config, but keeps it easier to maintain since you don't have to write the tag name twice. You simply create an empty tag with the value in the value attribute:
<?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>
XML strings
Zend_Config_Xml
is able to load an XML string
directly, such as that retrieved from a database. The string is passed
as the first parameter to the constructor and must start with the
characters '<?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');
Zend_Config XML namespace
Zend_Config
comes with it's own XML
namespace, which adds additional functionality to the parsing process. To take advantage
of it, you have to define a namespace with the namespace URI
http://framework.zend.com/xml/zend-config-xml/1.0/
in
your config root node.
With the namespace enabled, you can now use PHP constants within
your configuration files. Additionally, the extends
attribute was moved to the new namespace and is deprecated in the
NULL
namespace. It will be completely removed there in
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"