在开始之前,我有必要介绍一下 Zend_Application 。这是 Zend Framework 1.8 发布中的重大变更,可以说 Zend_Application 和其引入的 Bootstrap 及 Resource 概念,大大简化了应用程序的初始化组装过程,标志着 Zend Framework 真正迈向成熟。
Zend_Application 提出了两个关键概念 :
1. Bootstrap
对于 Bootstrap,我想接触过 Zend Framework 的人都不会陌生,意即把初始化程序的过程封装,以便管理及修改。在1.8版本出来之前,我想大部分人都是这样(或类似这样)写的 :
// Bootstrap.php class Bootstrap { // ... public function initLoader(){...} public function initController(){...} public function initDb(){...} public function initView(){...} public function initLayout(){...} public function initSession(){...} public function initAuth(){...} public function initAcl(){...} // ... }
这样通常会导致 Bootstrap 非常巨大而臃肿,而若以 Zend_Application 的形式来做的话,则只需要创建 Zend_Application 实例,并编写相关的配置文件 (.ini) 就可以了,至于如何创建我将在下面的内容中详细介绍。
2. Resource
Zend_Application_Resource 是 Zend Framework 针对 php 这种 web 开发语言的特性而加入的。它所阐述的思想是:按需加载 (Loaded On Demand) 。因为 php 每次解析都是资源循环的完整过程,这使得如何将每次php解析的代码量减至最低,就成了优化php应用程序的重要一环,也是众多框架在开发过程中的重点问题之一。
Resource 的概念实际上可以理解为 Zend Framework 组件,例如 Zend_Controller, Zend_Db, Zend_View 等等。同时它也允许用户自定资源以调用自己的组件。例如 Zend_Application_Resource_Db 的工作就是实例化 Zend_Db 对象,并设置默认 adapter :
class Zend_Application_Resource_Db extends Zend_Application_Resource_ResourceAbstract { // ... // Defined by Zend_Application_Resource_Resource public function init() { // ... $this->_db = Zend_Db::factory($adapter, $this->getParams()); Zend_Db_Table::setDefaultAdapter($db); return $db; // ... } }
目前 Zend Framework 1.8 提供的默认资源总共10个:
1. Zend_Application_Resource_Db
2. Zend_Application_Resource_Frontcontroller
3. Zend_Application_Resource_Layout
4. Zend_Application_Resource_Locale
5. Zend_Application_Resource_Modules
6. Zend_Application_Resource_Navigation
7. Zend_Application_Resource_Router
8. Zend_Application_Resource_Session
9. Zend_Application_Resource_Translate
10. Zend_Application_Resource_View
相信在未来的版本中会有所增加。
下面是初始化一个 FrontController 资源的最简单代码 :
// 定义应用程序路径 defined('APPLICATION_PATH') || define('APPLICATION_PATH', MY_PROJECT_ROOT . '/application'); // 定义应用程序环境 defined('APPLICATION_ENV') || define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'production')); // Zend_Application 和配置的 FrontController 信息 require_once 'Zend/Application.php'; $application = new Zend_Application( APPLICATION_ENV, array( 'resources' => array( 'FrontController' => array( 'controllerDirectory' => APPLICATION_PATH . '/controllers', ), ), ) ); // 加载资源并运行程序 $application->bootstrap(); $application->run();
而通过 Zend_Application_Resource_ResourceAbstract 虚拟类,我们可以很方便的注册自己的资源,然后通过配置文件 (如 Application.ini) 安插进各自的 Bootstrap 过程中。而同时我们可以通过Zend_Application_Bootstrap_Bootstrap::bootstrap($resource) 方法来动态载入所需资源 (resource) 。
例如我要注册一个自定义的视图 (View) 资源 :
// 自定义 view 资源 class Kbs_Application_Resource_View extends Zend_Application_Resource_ResourceAbstract { protected $_view; // 初始化 view // @return Zend_View $view public function init() { if (null === $this->_view) { $options = $this->getOptions(); $view = new Zend_View($options); ...... $viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper( 'ViewRenderer' ); $viewRenderer->setView($view); $this->_view = $view; } return $this->_view; } }
<