本周没什么工作,zend 系统性的东西渐渐忘记,抽时间整理一下代码!Zend_Application 负责加载配置以及初始化资源,所以index.php 会有这行代码
/** Zend_Application */ require_once 'Zend/Application.php'; // Create application, bootstrap, and run $application = new Zend_Application( APPLICATION_ENV, APPLICATION_PATH . '/configs/application.ini' ); $application->bootstrap() ->run();
Zend_application 如何初始化流程,下面是一个类图
上面大致画了一下Zend_Application 的类图的关系,Zend_Application 与 bootStrap 是聚合的关系,爱的死去活来,爱的只要你无怨,他也无悔。zend_Application 的主要工作就是加载配置文件application.ini 以及命名空间。其他的工作会代理给bootstrap类处理。
bootstrap主要负责加载两类资源,分别对应最上面的两个接口。
1.Zend_Application_Bootstrap_Bootstrapper 是 bootstrap 类的接口,Zend_Application_Bootstrap_BootstrapAbstract 实现Zend_Application_Bootstrap_Bootstrapper 的getClassResources 方法的代码
if (null === $this->_classResources) { if (version_compare(PHP_VERSION, '5.2.6') === -1) { $class = new ReflectionObject($this); $classMethods = $class->getMethods(); $methodNames = array(); foreach ($classMethods as $method) { $methodNames[] = $method->getName(); } } else { $methodNames = get_class_methods($this); } $this->_classResources = array(); foreach ($methodNames as $method) { if (5 < strlen($method) && '_init' === substr($method, 0, 5)) { $this->_classResources[strtolower(substr($method, 5))] = $method; } } }
所谓的classResource 就是在bootstrap 以_init 开头定义的方法 比如
1.class Bootstrap extends Zend_Application_Bootstrap_Bootstrap 2.{ 3. protected function _initView() 4. { 5. // Initialize view 6. $view = new Zend_View(); 7. $view->doctype('XHTML1_STRICT'); 8. $view->headTitle('My First Zend Framework Application'); 9. 10. // Add it to the ViewRenderer 11. $viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper( 12. 'ViewRenderer' 13. ); 14. $viewRenderer->setView($view); 15. 16. // Return it, so that it can be stored by the bootstrap 17. return $view; 18. } 19.}
2.Zend_Application_Bootstrap_ResourceBootstrapper 定义是加载资源的接口,就是我们在application.ini 以resource开头定义的资源比如
resources.db.adapter ="MYSQLI" resources.db.params.host ="localhost" resources.db.params.username ="root" resources.db.params.password ="123456" resources.db.params.dbname ="test"
资源的加载流程,通过zend_Application 加载配置,通过Zend_Loader_PluginLoader 进行加载文件,并在Zend_Application_Bootstrap_BootstrapAbstract的 loadPluginResource方法进行初始化资源类。
加载两类资源的入口在Zend_Application_Bootstrap_BootstrapAbstract的 _bootstrap 方法
protected function _bootstrap($resource = null) { if (null === $resource) { foreach ($this->getClassResourceNames() as $resource) { $this->_executeResource($resource); } foreach ($this->getPluginResourceNames() as $resource) { $this->_executeResource($resource); } } elseif (is_string($resource)) { $this->_executeResource($resource); } elseif (is_array($resource)) { foreach ($resource as $r) { $this->_executeResource($r); } } else { throw new Zend_Application_Bootstrap_Exception('Invalid argument passed to ' . __METHOD__); } }
分别加载calssResource 和 配置的 resource
注意 : 以上是zend framwork 1 而非 2。
--EOF--