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

站长资源综合门户

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

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

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

ZendView的构成

在ZF2中,View部分同样做了非常大的改动,将Layout,Helper都合并入View。在Zend1中,Layout是一个独立存在的组件,而ZF2中将Layout和Template统一称为ViewModel,ViewModel是树形结构,这样就可以实现模板的递归嵌套,而在ZF2中的Layout,本质上就是位于树形结构最底层的ViewModel。

ZF2的View由以下几个部分组成,称呼是AlloVince个人的翻译,不当之处还请指正:

ViewView 视图,主要接管MVC事件

ViewStrategy 策略器,统筹安排视图的主要容器Placeholders,同时会将视图的最终结果放入容器,拼合为最后呈现给用户的内容

ViewResolver 决策器,定义模板命名与实际路径的映射关系,同时决定模板最终对应的实际文件

ViewRenderer 渲染器,在决策器的辅助下,将ViewModel转换为文本输出。一个渲染器必须对应一个决策器才能工作。

ViewModel 视图模型,包括了视图中可能用到的所有变量。自身为树形结构,一个视图模型可以包含若干子模型

ViewHelper 视图助手,辅助生成HTML标签

在MVC构架中,ZendMvcViewViewManager会整合上述所有部分,最终构成整个视图。

ZendView的初始化

回到上一节,在bootstrap事件被触发时,视图部分做了一些主要的准备工作,包括:

指定一个MVC专用的策略器ZendMvcViewDefaultRenderingStrategy,在这个策略器中将最顶层的ViewModel重定义Layout。注册MvcEvent::EVENT_RENDER事件

注入模板监听ZendMvcViewInjectTemplateListener,最主要的作用是通过Controller和Action的名字来生成默认的视图名

注入视图模型监听ZendMvcViewInjectViewModelListener

那么其实我们可以得出结论,Zend的Mvc中在bootstrap阶段,视图的所有准备工作都已经就绪了,并没有等到路由结束或者Controller启动。这样做的用意在于当路由失败时,仍然可以有对应的视图来呈现异常结果。

 

MVC启动阶段

ZendSkeletonApplication/public/index.php

$response = $app->run();

启动阶段对应的事件有

route 路由

dispatch 分发

如果异常发生,则会提前结束启动过程,分发事件有可能不会触发而直接触发finish(结束)事件。

Route路由启动

ZF2的路由最有意义的重构是允许路由以树形结构排布,路由之间可以设置优先级。简单的介绍可以参考Introducing Zend Framework 2.0 Router。所以ZF2的路由可以实现分别在每个模块下设置,同时可以在某些模块提高优先级别。非常适合大规模应用的部署。

在路由启动过程中,ZendMvcRouteListener→onRoute()被触发,路由从树形结构逐一匹配,最终以ZendMvcRouterRouteMatch对象的形式返回一个最适配的路由。

Dispatch分发过程

ZF2的Dispatch分发其实有两次,一次是在ZendMvcApplication中,目的是将匹配的RouteMatch通过参数定位到某个特定的Controller,另一次是在ZendMvcController,目的是将Request/Response注入,同时运行对应的Action。

流程如下

//分发事件被触发

ZendMvcDispatchListener->onDispatch();

//根据匹配路由的参数定位到某个controller

$controller = $controllerLoader->get($controllerName);

//触发controlller的dispatch

$return = $controller->dispatch($request, $response);

发送最终响应并结束MVC

ZendSkeletonApplication/public/index.php

$response->send();

分发结束后,如果正确的从controller获得响应,会继续运行

ZendMvcApplication->completeRequest()

这里会触发MVC事件的最后两个

render 渲染

finish 结束

//调用MVC默认策略器的render事件

ZendMvcViewDefaultRenderingStrategy->render();

Render事件会将ZendView的各部分整合,最终组装成一个ZendHttpPhpEnvironmentResponse,发送给用户。

这就是Zend2.0的MVC完整过程。

原文地址:http://avnpc/pages/upgrade-ubuntu10-04-to-php5-3-6

分享到:

网友评论

热门编程程序