以下内容转载自:
谢谢前辈的分享
Zend Framework 版本 1.10
在应用程序的初始化引导过程中,主要由Zend_Application类对配置文件进行加载。Zend_Application_Bootstrap_BootstrapAbstract类也会根据配置文件加载相应的引导资源类。因此我们只要看看Zend_Application类的setOptions()方法和Zend_Application_Bootstrap_BootstrapAbstract的setOptions()方法,便大概可以知道配置文件应该怎么写了。
下面以Ini配置文件为例。
先看Zend_Application类的setOptions()方法
/* ** Set application options** @param array $options* @throws Zend_Application_Exception When no bootstrap path is provided* @throws Zend_Application_Exception When invalid bootstrap information are provided* @return Zend_Application */ public function setOptions( array $options ){ // 如果键config不为空,加载config文件 if ( ! empty ( $options [ ' config ' ])) { if ( is_array ( $options [ ' config ' ])) { $_options = array (); foreach ( $options [ ' config ' ] as $tmp ) { $_options = $this -> mergeOptions( $_options , $this -> _loadConfig( $tmp ));} $options = $this -> mergeOptions( $_options , $options );} else { $options = $this -> mergeOptions( $this -> _loadConfig( $options [ ' config ' ]) , $options );}} $this -> _options = $options ; $options = array_change_key_case ( $options , CASE_LOWER); $this -> _optionKeys = array_keys ( $options ); // 设置php的配置 if ( ! empty ( $options [ ' phpsettings ' ])) { $this -> setPhpSettings( $options [ ' phpsettings ' ]);} // 设置加载路径 if ( ! empty ( $options [ ' includepaths ' ])) { $this -> setIncludePaths( $options [ ' includepaths ' ]);} // 设置自动加载的命名空间 if ( ! empty ( $options [ ' autoloadernamespaces ' ])) { $this -> setAutoloaderNamespaces( $options [ ' autoloadernamespaces ' ]);} // 设置自动加载zend framework 的路径 if ( ! empty ( $options [ ' autoloaderzfpath ' ])) { $autoloader = $this -> getAutoloader(); if ( method_exists ( $autoloader , ' setZfPath ' )) { $zfPath = $options [ ' autoloaderzfpath ' ]; $zfVersion = ! empty ( $options [ ' autoloaderzfversion ' ]) ? $options [ ' autoloaderzfversion ' ] : ' latest ' ; $autoloader -> setZfPath( $zfPath , $zfVersion );}} // 设置自定义的bootstrap类 if ( ! empty ( $options [ ' bootstrap ' ])) { $bootstrap = $options [ ' bootstrap ' ]; if ( is_string ( $bootstrap )) { $this -> setBootstrap( $bootstrap );} elseif ( is_array ( $bootstrap )) { if ( empty ( $bootstrap [ ' path ' ])) { throw new Zend_Application_Exception( ' No bootstrap path provided ' );} $path = $bootstrap [ ' path ' ]; $class = null ; if ( ! empty ( $bootstrap [ ' class ' ])) { $class = $bootstrap [ ' class ' ];} $this -> setBootstrap( $path , $class );} else { throw new Zend_Application_Exception( ' Invalid bootstrap information provided ' );}} return $this ;} 首先,如果"config"不为空,递归加载配置文件。
这也就是说:我们可以有多个配置文件,但是在初始化Zend_Application对象的时候,只要把主配置文件的路径作为参数传给Zend_Application的构造函数就可以了。我们可以把不同的配置分成多个配置文件,如php配置的写在一个配置文件,数据库的配置写一个配置文件,引导资源的配置写一个配置文件,然后写一个主配置文件,其它包含之前的那些配置文件就可以了,如:
主配置文件:
[ yourenvironment ] config.phpsettingconfig = APP_ROOT "/config/phpsettingconfig.ini"config.dbconfig = APP_ROOT "/config/dbconfig.ini"config.resourceconfig = APP_ROOT "/config/resourceconfig.ini" 这样,我们就不必把配置都写在一个配置文件中,可以分开几个,逻辑划分上更加清晰。
然后,键为phpsettings的,调用setPhpSettings()方法进行设置
也就是说php配置我们也可以写在Zend Framework的配置文件里。如下面是phpsettingconfig.ini的内容
[yourenvironment]
phpSettings.date.timezone = " Asia/Shanghai " phpSettings.display_startup_errors = 1 phpSettings.display_errors = 1 此设置跟php配置文件php.ini基本一样,只要在设置项前加phpSettings就可以了(phpSettings大小写不限)
再看一下如果在配置文件里设置自定义的bootstrap文件
[ yourenvironment ] #可以是一个文件名字符串,此时你的自定义bootstrap类的类名必须是默认的 " Bootstrap " bootstrap = APP_ROOT " /application/bootstrap.php " #如果你的类名不叫 " Bootstrap " 而是叫 " MyBootstrap " , 你可以这样配置bootstrap.path = APP_ROOT " /applicaton/bootstrap.php " bootstrap.class = " MyBootstrap "
在Zend_Application中对配置项的引导,大概就这些。
引导资源的初始化,主要是在Zend_Application_Bootstrap_BootstrapAbstract类的setOptions()方法中。
Zend_Application_Bootstrap_BootstrapAbstract类的setOptions()方法主要功能是根据配置文件设置引导资源的加载目录,以及根据配置文件初始化引导资源。根据配置文件初始化引导资源主要体现在如下代码中:
if ( in_array ( $method , $methods )) { $this -> $method ( $value );} elseif ( ' resources ' == $key ) { // 或者是注册引导资源 foreach ( $value as $resource => $resourceOptions ) { $this -> registerPluginResource( $resource , $resourceOptions );}} 也就是说配置文件中resources开头的配置项,都会作为引导资源
如数据库的配置
[ yourenvionment ] resources.db.adapter = PDO_MYSQL resources.db.params.host = localhost resources.db.params.username = root resources.db.params.password = resources.db.params.dbname = test 如果把ini文件描述成一个数组,那么$ini['resources']['db']将作为一个构造函数的参数,传给Zend_Application_Resource_ResourceAbstract的构造函数。
然后,adapter 映射 Zend_Application_Resource_Db类的中setAdapter()方法,$ini['resources']['db']['adapter']的值作为setAdapter()方法的参数。params映射Zend_Application_Resource_Db类的中setParams()方法,$ini['resources']['db']['params']的值作为setParams()方法的参数。