Zend_Config Proposal V3!

classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

Zend_Config Proposal V3!

akrabat
Hi all!

I've updated the Zend_Config proposal to version 3 so that it covers the
points raised from v2.1. Hopefully this is the last one before incubation :)

You can find prototype code (Akrabat_Config v0.8) at:
   http://www.akrabat.com/2006/05/21/zend_config-proposal-v3/


Comments welcome :)

Regards,

Rob...


Zend Framework Component Proposal


Proposed Component Name
-----------------------------------------------
Zend_Config


Proposers
-----------------------------------------------
Rob Allen ([hidden email]


Revision
-----------------------------------------------
3.0 - 21 May 2006: Further reworking based on mailing list.


Overview
-----------------------------------------------
Zend_Config is a very simple configuration file reader.
It provides an easy means to read configuration files
and access the data within them as a set of key->value
pairs. It will support at least one nested level of data.
Initially providing support for ini files, it should
be easy to extend for other formats such as YAML.


References
-----------------------------------------------
Mailing list thread resurrected here:
    http://www.zend.com/lists/fw-general/200604/msg00178.html.
Unfortunately, I could not find the original post by Andi Gutmans
in the archives.

Other discussion can be found here:
    http://www.akrabat.com/index.php?s=Akrabat_Config

Feedback on v1 from Zend is discussed here:
    http://www.zend.com/lists/fw-general/200605/msg00134.html
   
Prototype code can be found here:
    http://www.akrabat.com/2006/05/13/zend_config-proposal-v2/

Mailing list feedback on v2 is discussed here:
    http://www.zend.com/lists/fw-general/200605/msg00563.html
   
Mailing list discussion on v2.1 is here:
    http://www.zend.com/lists/fw-general/200605/msg00748.html


Requirements
-----------------------------------------------
* Ability to load configuration information from a single config file
  and provide access to the data as object properties.
* A top level section name must be specified for loading.
* Optional option to allow modification of the config data held in
  memory.
* No ability to modify the original data in the config file.
* For ini files, support for "namespaces" using the syntax:
        namespace.property = value
* Iterator is implemented for easily listing of configuration
  information.
* A special "inheritence keyword "extends" will be be used to allow for
  including additional sections within this section. For ini files,
  the syntax would be:
        extends = section


Dependencies on Other Framework Components
-----------------------------------------------
Zend_Exception


Theory of Operation
-----------------------------------------------
Zend_Config loads an provides a property based interface to an array.
The data is read only unless $allowModifications is set to true on
construction. Zend_Config also implements Countable and Interator to
facilitate easy access to the data.

Sometimes it is necessary to get at a group of config variables as an
array (e.g. the $config paramter in Zend_Db::factory()). Zend_Config
provides the function "asArray()" to allow easy integration with such
requirements.

Zend_Config_Ini is a class thatloads ini files and creates and
associated array for use by Zend_Config. It loads a single section from
the specified ini file. It supports using the full stop character (".")
in a key name to provide additional nesting levels. That is, a key named
"db.name" will be represented in the array as $data['db']['name'].

Zend_Config_ini also supports loading of keys from one section of the
ini file into another section. This is done using a special key called
"extends". It is possible for the parent section to itself extend from
another section. Multiple inheritence such that a section can extend
from two or more sections is not permitted.

In order to make it easy to use with Zend_Config, Zend_Config_Ini has a
static method, "load()", which loads the ini file and returns the array.

In the future, should there be demand for other config file types, other
Zend_Config_XXX classes can be created for use by Zend_Config. The only
requirement would be for such classes to be able to generate an
associative array for loading into Zend_Config.


Class Index
-----------------------------------------------
Zend_Config_Exception
Zend_Config
Zend_Config_Ini


Use Cases
-----------------------------------------------
Given the following "myapp.ini" file:
    [all]
    namespace.property = example
    db.connection = foo
    db.name = bar
    db.password = pwd
    hostname = www.zend.com

    [dev]
    extends=all
    hostname=andi_box
    db.name=local

    [andi_dev]
    extends=development
    hostname=andi_box
    db.connection=localhost

    [staging]
    extends=all
    hostname=dev.zend.com


Then we can do something like:

<?php
    $obj=new Zend_Config(Zend_Config_Ini::load('myapp.ini', 'andi_dev'));
   
    print $obj->hostname;   // prints "andi_box"
    print $obj->db->connection; // prints "localhost"
    print $obj->db->name; // prints "local"
    print $obj->db->password; // prints "pwd"
?>


Example use with Zend_Db:
"db.ini" file:
    [all]
    db.type = pdoMssql
    db.config.host = localhost
    db.config.username = user
    db.config.password = pwd
    db.config.dbname = db

<?php
    $obj=new Zend_Config(Zend_Config_Ini::load('db.ini', 'all'));
    $db = Zend_Db::factory($obj->db->type, $obj->db->config->asArray());
?>



Class Skeletons
-----------------------------------------------
class Zend_Config_Exception extends Zend_Exception {}

class Zend_Config implements Countable, Iterator
{
    protected $_allowModifications;
    protected $_iterationPointerValid;
    protected $_data;
   
    /**
     * Akrabat_Config provides a property based interface to
     * an array. The data is read only unless $allowModifications
     * is set to true on construction.
     *
     * Akrabat_Config also implements Countable and Interator to
     * facilitate easy access to the data.
     *
     * @param array $array
     * @param boolean $allowModifications
     */
     public function __construct($array, $allowModifications=false) {}

    /**
     * Ensure that the key is a valid PHP property name
     *
     * @param string $key
     * @return boolean
     */
    protected function isValidKeyName($key) {}
   
    /**
     * Magic function so that $obj->value will work.
     *
     * @param string $name
     * @return mixed
     */
    public function __get($name) {}
   
    /**
     * Only allow setting of a property if $allowModifications
     * was set to true on construction. Otherwise, throw an exception.
     *
     * @param string $name
     * @param mixed $value
     */
    public function __set($name, $value) {}
   
    /**
     * Return an associative array of the stored data.
     *
     * @return array
     */
    public function asArray()

    /**
     * Support isset() overloading on PHP 5.1
     *
     * @param string $name
     * @return boolean
     */
    protected function __isset($name)
   
    /**
     * Defined by Countable interface
     */
    function count() {}
   
    /**
     * Defined by Interator interface
     */
    function current () {}
    function key () {}
    function next () {}
    function rewind () {}
    function valid () {}
}


class Zend_Config_Ini
{
    /**
     * Load $section from an ini file called $filename into
     * an associative array.
     *
     * If any keys with $section are called "extends", then the section
     * pointed to by the "extends" is then included into the properties.
     * Note that the keys in $section will override any keys of the same
     * name in the sections that have been included via "extends".
     *
     * If any key includes a ".", then this will act as a separator to
     * create a sub-property.
     *
     * @param string $filename
     * @param string $section
     * @return array
     */
    public static function load($filename, $section) {}

    /**
     * Helper function to process each element in the section and handle
     * the "extends" inheritance keyword. Passes control to processKey()
     * to handle the "dot" sub-property syntax in each key.
     *
     * @param array $iniArray
     * @param string $section
     * @param array $config
     * @return array
     */
    protected function processExtends($iniArray, $section, $config) {}

    /**
     * Assign the key's value to the property list. Handle the "dot"
     * notation for sub-properties by passing control to
     * processLevelsInKey().
     *
     * @param array $config
     * @param string $key
     * @param string $value
     * @return array
     */
    function processKey($config, $key , $value) {}

    /**
     * Helper function to handle the "dot" namespace syntax in the key.
     * Uses "." as the separator.
     *
     * @param array $parent
     * @param string $key
     * @param string $value
     * @return array
     */
    protected function processLevelsInKey($parent, $key, $value) {}

}
Reply | Threaded
Open this post in threaded view
|

Re: Zend_Config Proposal V3!

André Hoffmann
download doesn't work

On 5/21/06, Rob Allen <[hidden email]> wrote:
Hi all!

I've updated the Zend_Config proposal to version 3 so that it covers the
points raised from v2.1. Hopefully this is the last one before incubation :)

You can find prototype code (Akrabat_Config v0.8 ) at:
   http://www.akrabat.com/2006/05/21/zend_config-proposal-v3/


Comments welcome :)

Regards,

Rob...



Zend Framework Component Proposal


Proposed Component Name
-----------------------------------------------
Zend_Config


Proposers
-----------------------------------------------
Rob Allen ([hidden email]


Revision
-----------------------------------------------
3.0 - 21 May 2006: Further reworking based on mailing list.


Overview
-----------------------------------------------
Zend_Config is a very simple configuration file reader.
It provides an easy means to read configuration files
and access the data within them as a set of key->value
pairs. It will support at least one nested level of data.
Initially providing support for ini files, it should
be easy to extend for other formats such as YAML.


References
-----------------------------------------------
Mailing list thread resurrected here:
    http://www.zend.com/lists/fw-general/200604/msg00178.html.
Unfortunately, I could not find the original post by Andi Gutmans
in the archives.

Other discussion can be found here:
    http://www.akrabat.com/index.php?s=Akrabat_Config

Feedback on v1 from Zend is discussed here:
     http://www.zend.com/lists/fw-general/200605/msg00134.html

Prototype code can be found here:
     http://www.akrabat.com/2006/05/13/zend_config-proposal-v2/

Mailing list feedback on v2 is discussed here:
    http://www.zend.com/lists/fw-general/200605/msg00563.html

Mailing list discussion on v2.1 is here:
    http://www.zend.com/lists/fw-general/200605/msg00748.html


Requirements
-----------------------------------------------
* Ability to load configuration information from a single config file
  and provide access to the data as object properties.
* A top level section name must be specified for loading.
* Optional option to allow modification of the config data held in
  memory.
* No ability to modify the original data in the config file.
* For ini files, support for "namespaces" using the syntax:
        namespace.property = value
* Iterator is implemented for easily listing of configuration
  information.
* A special "inheritence keyword "extends" will be be used to allow for
  including additional sections within this section. For ini files,
  the syntax would be:
        extends = section


Dependencies on Other Framework Components
-----------------------------------------------
Zend_Exception


Theory of Operation
-----------------------------------------------
Zend_Config loads an provides a property based interface to an array.
The data is read only unless $allowModifications is set to true on
construction. Zend_Config also implements Countable and Interator to
facilitate easy access to the data.

Sometimes it is necessary to get at a group of config variables as an
array (e.g. the $config paramter in Zend_Db::factory()). Zend_Config
provides the function "asArray()" to allow easy integration with such
requirements.

Zend_Config_Ini is a class thatloads ini files and creates and
associated array for use by Zend_Config. It loads a single section from
the specified ini file. It supports using the full stop character (".")
in a key name to provide additional nesting levels. That is, a key named
"db.name" will be represented in the array as $data['db']['name'].

Zend_Config_ini also supports loading of keys from one section of the
ini file into another section. This is done using a special key called
"extends". It is possible for the parent section to itself extend from
another section. Multiple inheritence such that a section can extend
from two or more sections is not permitted.

In order to make it easy to use with Zend_Config, Zend_Config_Ini has a
static method, "load()", which loads the ini file and returns the array.

In the future, should there be demand for other config file types, other
Zend_Config_XXX classes can be created for use by Zend_Config. The only
requirement would be for such classes to be able to generate an
associative array for loading into Zend_Config.


Class Index
-----------------------------------------------
Zend_Config_Exception
Zend_Config
Zend_Config_Ini


Use Cases
-----------------------------------------------
Given the following "myapp.ini" file:
    [all]
    namespace.property = example
    db.connection = foo
    db.name = bar
    db.password = pwd
    hostname = www.zend.com

    [dev]
    extends=all
    hostname=andi_box
    db.name=local

    [andi_dev]
    extends=development
    hostname=andi_box
    db.connection=localhost

    [staging]
    extends=all
    hostname=dev.zend.com


Then we can do something like:

<?php
    $obj=new Zend_Config(Zend_Config_Ini::load('myapp.ini', 'andi_dev'));

    print $obj->hostname;   // prints "andi_box"
    print $obj->db->connection; // prints "localhost"
    print $obj->db->name; // prints "local"
    print $obj->db->password; // prints "pwd"
?>


Example use with Zend_Db:
"db.ini" file:
    [all]
     db.type = pdoMssql
    db.config.host = localhost
    db.config.username = user
    db.config.password = pwd
    db.config.dbname = db

<?php
    $obj=new Zend_Config(Zend_Config_Ini::load('db.ini', 'all'));
    $db = Zend_Db::factory($obj->db->type, $obj->db->config->asArray());
?>



Class Skeletons
-----------------------------------------------
class Zend_Config_Exception extends Zend_Exception {}

class Zend_Config implements Countable, Iterator
{
    protected $_allowModifications;
    protected $_iterationPointerValid;
    protected $_data;

    /**
     * Akrabat_Config provides a property based interface to
     * an array. The data is read only unless $allowModifications
     * is set to true on construction.
     *
     * Akrabat_Config also implements Countable and Interator to
     * facilitate easy access to the data.
     *
     * @param array $array
     * @param boolean $allowModifications
     */
     public function __construct($array, $allowModifications=false) {}

    /**
     * Ensure that the key is a valid PHP property name
     *
     * @param string $key
     * @return boolean
     */
    protected function isValidKeyName($key) {}

    /**
     * Magic function so that $obj->value will work.
     *
     * @param string $name
     * @return mixed
     */
    public function __get($name) {}

    /**
     * Only allow setting of a property if $allowModifications
     * was set to true on construction. Otherwise, throw an exception.
     *
     * @param string $name
     * @param mixed $value
     */
    public function __set($name, $value) {}

    /**
     * Return an associative array of the stored data.
     *
     * @return array
     */
    public function asArray()

    /**
     * Support isset() overloading on PHP 5.1
     *
     * @param string $name
     * @return boolean
     */
    protected function __isset($name)

    /**
     * Defined by Countable interface
     */
    function count() {}

    /**
     * Defined by Interator interface
     */
    function current () {}
    function key () {}
    function next () {}
    function rewind () {}
    function valid () {}
}


class Zend_Config_Ini
{
    /**
     * Load $section from an ini file called $filename into
     * an associative array.
     *
     * If any keys with $section are called "extends", then the section
     * pointed to by the "extends" is then included into the properties.
     * Note that the keys in $section will override any keys of the same
     * name in the sections that have been included via "extends".
     *
     * If any key includes a ".", then this will act as a separator to
     * create a sub-property.
     *
     * @param string $filename
     * @param string $section
     * @return array
     */
    public static function load($filename, $section) {}

    /**
     * Helper function to process each element in the section and handle
     * the "extends" inheritance keyword. Passes control to processKey()
     * to handle the "dot" sub-property syntax in each key.
     *
     * @param array $iniArray
     * @param string $section
     * @param array $config
     * @return array
     */
    protected function processExtends($iniArray, $section, $config) {}

    /**
     * Assign the key's value to the property list. Handle the "dot"
     * notation for sub-properties by passing control to
     * processLevelsInKey().
     *
     * @param array $config
     * @param string $key
     * @param string $value
     * @return array
     */
    function processKey($config, $key , $value) {}

    /**
     * Helper function to handle the "dot" namespace syntax in the key.
     * Uses "." as the separator.
     *
     * @param array $parent
     * @param string $key
     * @param string $value
     * @return array
     */
    protected function processLevelsInKey($parent, $key, $value) {}

}





--
best regards,
André Hoffmann
Germany
Reply | Threaded
Open this post in threaded view
|

Re: Zend_Config Proposal V3!

akrabat
André Hoffmann wrote:
> download doesn't work
>

What is it about my use of my website at the moment ?!


Fixed now.

Regards,

Rob...