用 Zend_Application 实现多模块 (multi-modules) 及多模板 (multi-templates) 应用程序


 

在开始之前,我有必要介绍一下 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;
    }
}

<


豫ICP备12024565号-1   E-mail:admin@hlc8.com