会员登录 | 会员注册 | 意见建议 | 网站地图

站长资源综合门户

当前位置:首页 > 站长学院 > 编程程序 > Zend Framework 2.0的Mvc结构及启动流程分析

Zend Framework 2.0的Mvc结构及启动流程分析

时间:2012-07-18 19:43:18   作者:   来源:   点击:

概要

首先需要明确的是,Zend2.0的启动以及MVC构架是完全基于事件驱动的。如果对事件驱动还不太了解的话,应该先弄清楚什么是ZF2的事件驱动,并掌握基本的EventManager用法,这是阅读本文的基础。请参考Using the ZF2 EventManager。

基于事件驱动MVC与传统的MVC有什么不同,简单说就是由传统的复杂流程式调用过程。变成了先在某处注册事件,然后在某处触发事件的简单二元关系,事件不受代码结构和调用流程的影响,可以方便的解除耦合。

而在最近才引入的ServiceManager也是Zend1中完全没有的概念,在我的理解来看,ServiceManager的引入是ZF2开发小组对于引入Di可能带来的元数据式编程问题(Metaprogramming)的一种反思。

ServiceManager带来的好处是:

将整个Zend构架的主要部分形象化,让结构更有组织,更利于理解

简化Di的配置,降低学习成本

进一步弱化了Bootstrap,让整个启动过程更加简洁

ServiceManager带来的不好之处是:

将Di做一层封装,无法直接通过配置文件控制整个构架

自定义需求比较高的时候,反而提高了学习成本,因为在学习Di的同时还要学习ServiceManager

那么闲聊至此,开始进入真正的Zend2.0 MVC构架流程分析,这里以5月21日的ZendSkeletonApplication为例:

第一部分:初始化ServiceManager

ZendSkeletonApplication/public/index.php

$configuration = include 'config/application.config.php';

$serviceManager = new ServiceManager(new ServiceManagerConfiguration($configuration['service_manager']));

$serviceManager->setService('ApplicationConfiguration', $configuration);

读取整个应用的基础配置文件,初始化Mvc框架所需要的ServiceManager。

这个过程中默认所依赖的所有类都写在ZendMvcServiceServiceManagerConfiguration中。ServiceManager的内部被划分为5类

services 服务

factories 工厂

abstractFactories 抽象工厂

aliases 别名

shared 共享服务

项目的配置文件application.config.php会复写Zend的默认配置并载入,比如如果需要使用一个自定义的服务,可以在配置文件中这样写

 

<?php

return array(

'service_manager' => array(

'use_defaults' => true,

'services' => array(

'ViewManager' => 'EvaEngineMvcViewModuleViewManager',

),

),

);

 

第二部分:初始化模块

ZendSkeletonApplication/public/index.php

$serviceManager->get('ModuleManager')->loadModules();

ServiceManager中的ModuleManager,本质上是对ZendMvcServiceModuleManagerFactory的一个封装,主要做的工作包括:

获得项目配置文件中需要载入的模块列表

按配置遍历模块,分别载入模块的配置文件

合并模块的配置文件

在配置文件中,可以通过modules节点控制具体载入哪些模块。

模块的载入同样采用了事件驱动,通过模块管理器ZendModuleManagerModuleManager配合模块事件ZendModuleManagerModuleEvent实现,在载入模块的过程中会依次触发

loadModules.pre 所有模块载入前

loadModule.resolve 每个模块载入

loadModule 每个模块载入后

loadModules.post 所有模块载入后

 

第三部分:启动MVC

终于到了MVC部分,整个MVC的流程都伴随着事件驱动,ZF2将其定义为MVC事件,按照执行顺序依次包括:

bootstrap 引导

route 路由

dispatch 分发

render 渲染

finish 结束

所以为了方便说明,将

ZendSkeletonApplication/public/index.php的

$serviceManager->get('Application')->bootstrap()->run()->send();

拆分为三个阶段

 

Bootstrap引导阶段

$app = $serviceManager->get('Application')->bootstrap();

在Zend1中,Bootstrap曾经是MVC的核心部分,在ZF2中,由于事件驱动的引入,这一部分变得非常简单清晰:

首先在ZendMvcApplication→bootstrap()中,注册了所有MVC事件,初始化MvcEvent(将Request/Response/Router等注入),同时触发bootstrap事件。

这一过程中,View部分的初始化相对复杂,单独说明如下

分享到:

网友评论

热门编程程序