Zend-MVC事件
Zend\Mvc\MvcEvent继承自Zend\EventManager\Event,在Zend\Mvc\Application::bootstrap()执行时触发。如果你的控制器实现了Zend\Mvc\InjectApplicationEventInterface,MvcEvent将会被注入到这些控制器中。
MvcEvent会为下列对象添加获取器和规则:Application、Request、Response、Router、RouterMatch、Result(通常为调度控制器的结果)、ViewModel(一般展示了视图模型布局)。Application、Request、Response、Router和ViewModel都是在bootstrap事件过程中注入。接下来的route事件会被注入RouteMatch对象,用来封装routing的结果。RouteMatch对象在整个MVC中都会使用,所以通常会通过RouteMatch获取Route、Request、Response对象。
MvcEvent还定义了如下方法:
setApplication($application)
getApplication()
setRequest($request)
getRequest()
setResponse($reponse)
getResponse()
setRouter($router)
getRouter()
setRouteMatch($routeMatch)
getRouteMatch()
setResult()
getResult()
setViewModel($viewModel)
getViewModel()
isError()
setError()
getError()
getController()
setController($name)
getControllerClass()
setControllerClass($class)
事件被触发的顺序:
| Name | Constant | Description |
| bootstrap | MvcEvent::EVENT_BOOTSTRAP | 通过创建ViewManager来引导application |
| route | MvcEvent::EVENT_ROUTE | 执行路由(或者路由相关的行为) |
| dispatch | MvcEvent::EVENT_DISPATCH | 将匹配到的路由调度给相应的控制器/行为 |
| dispatch.error | MvcEvent::EVENT_DISPATCH_ERROR | 当调度过程中发生错误时会被触发 |
| render | MvcEvent::EVENT_RENDER | 准备数据并将渲染任务委托给视图层 |
| render.error | MvcEvent::EVENT_RENDER_ERROR | render过程错误发生时触发 |
| finish | MvcEvent::EVENT_FINISH | 一旦所有的事情完成后,本事件触发完成相应的任务 |
详细介绍:
MvcEvent::EVENT_BOOTSTRAP("bootstrap")
监听器:Zend\Mvc\View\Http\ViewManager,onBootstrap方法会被调用。
作用:准备好视图层(也就是实例化Zend\Mvc\View\Http\ViewManager)。
触发方式:Zend\Mvc\Application bootstrap()方法。
MvcEvent::EVENT_ROUTE("route")
监听器1:Zend\Mvc\ModuleRouteListener::onRoute
作用:决定了模块命名空间是否应该添加在控制器名字前面,主要是防止路由匹配包含的参数键匹配到了MODULE_NAMESPACE常量
监听器2:Zend\Mvc\RouteListener::onRoute 如果没有路由没有匹配到MvcEvent::EVENT_DISPATCH_ERROR会被触发。
作用:尝试将request匹配到路由器,并返回一个RouteMatch对象。
触发方式:Zend\Mvc\Application::run
作用:如果路由过程中有错误发生,将会使用一个短回路的回调来停止事件持续传播。
MvcEvent::EVENT_DISPATCH("dispatch")
监听器分为两类:一类时只限于控制台环境,还有一类只限于HTTP环境,还有全坏境适用的监听器。本文不介绍CONSOLE环境。console环境可以查看官方文档。
类Zend\Mvc\View\Http\CreateViewModelListener里面有两个函数作为本事件的监听器:
1、createViewModelFromArray(如果控制器行为返回一个关联数组,该监听器将数组转化为一个ViewModel对象。
2、createViewModelFromNull(控制器返回的时一个空值,则该方法将其转化为一个ViewModel对象)
类Zend\Mvc\View\Http\RouteNotFoundStrategy::prepareNotFoundViewModel 创建并返回一个404ViewModel
类Zend\Mvc\View\Http\InjectTemplateListener::injectTemplate 把一个模版注入到视图模型中。模版名继承自路由匹配的控制器名(或是控制器里的action)
类Zend\Mvc\View\Http\InjectViewModelListener::injectViewModel 插入一个ViewModel并添加至MvcEvent对象。有两种情况:a)作为子对象加入,包含view model。b)结果可终止的情况下替换掉默认情况
类Zend\Mvc\MiddlewareListener::onDispatch会触发MvcEvent::EVENT_DISPATCH_ERROR,从service manager里面加载并调度匹配到的PSR-7中间件。
类Zend\Mvc\DispatchListener::onDispatch会触发MvcEvent::EVENT_DISPATCH_ERROR作用同上。
类Zend\Mvc\Controller\AbstractController::onDispatch本方法是一个抽象类。
触发方式:
Zend\Mvc\Application::run使用短回路的回调来终止事件的传播。(路由时有错误发生时)
Zend\Mvc\Controller\AbstractController::dispatch如果有监听器返回一个Response对象,将终止事件传播。每当AbstractController监听本事件的时候,被触发时都会调用onDispatch方法。
MvcEvent::EVENT_RENDER("render")
监听器:
Zend\Mvc\View\Console\DefaultRenderingStrategy::render 用来渲染视图
Zend\Mvc\View\Http\DefaultRenderingStrategy::render同样渲染视图,注意和上面的环境区别
触发方式:
Zend\Mvc\Application::competeRequest本事件在MvcEvent::FINISH触发前触发。
MvcEvent::EVENT_FINISH("finish")
监听器:
Zend\Mvc\SendResponseListener::sendResponse触发SendResponseEvent来准备response。
触发方式:
Zend\Mvc\Application::run 一旦MvcEvent::ROUTE或MvcEvent::DISPATCH事件返回了一个正确的ResponseInterface就会触发本事件
Zend\Mvc\Application::completeRequest触发在MvcEvent::RENDER之后(也就是说,此时视图已经被渲染了)。
关于SendResponse事件
Zend\Mvc\ResponseSender\SendResponseEvent定义了如下方法:
setResponse($response)
getResponse()
setContentSent()
contentSent()
setHeadersSent()
headersSent()
这些方法用来设置应答头和应答内容。
监听器:
Zend\Mvc\SendResponseListener\PhpEnvironmentResponseSender::__invoke 使用环境HTTP
Zend\Mvc\SendResponseListener\ConsoleResponseSender::__invoke使用环境为console。
Zend\Mvc\SendResponseListener\SimpleStreamResponseSender::__invoke
MvcEvent::FINISH事件被触发后本事件执行
Zend-MVC事件的更多相关文章
- asp.net mvc 事件顺序
1. OnActionExecuting 2. Before return View() 3. OnActionExecuted 4. OnResultExecuting 5. Hello from ...
- 【原创】Zend Framework 2框架之MVC
ZendFramework 2框架之MVC 作者:sys(360电商技术组) 1.前言 Zend Framework 2是zend官方推出的php开源框架,基于php5.3.他全然採用面向对象的代码实 ...
- 转:Zend Framework 2.0 分析
文章来自于:http://bbs.phpchina.com/thread-268362-1-1.html ZF2已经发布,与ZF1相比,MVC这一模块内部的实现机制可谓大相径庭,许多用过ZF1的PHP ...
- ZendFramework-2.4 源代码 - 关于MVC - Controller层
// 1.控制器管理器 class ServiceManager implements ServiceLocatorInterface { public function __construct(Co ...
- Google 地图 API V3 之事件
Google官方教程: Google 地图 API V3 使用入门 Google 地图 API V3 针对移动设备进行开发 Google 地图 API V3 之事件 Google 地图 API V3 ...
- Phalcon的Mvc结构及启动流程(部分源码分析)
Phalcon本身有支持创建多种形式的Web应用项目以应对不同场景,包括迷你应用.单模块标准应用.以及较复杂的多模块应用 创建项目 Phalcon环境配置安装后,可以通过命令行生成一个标准的Phalc ...
- zend framework分析总结[转]
版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章原始出版.作者信息和本声明.否则将追究法律责任.http://blog.csdn.net/mayongzhan - 马永占,myz,may ...
- Phalcon Framework的MVC结构及启动流程分析
目前的项目中选择了Phalcon Framework作为未来一段时间的核心框架.技术选型的原因会单开一篇Blog另说,本次优先对Phalcon的MVC架构与启动流程进行分析说明,如有遗漏还望指出. P ...
- Phalcon Framework的Mvc结构及启动流程(部分源码分析)
创建项目 Phalcon环境配置安装后,可以通过命令行生成一个标准的Phalcon多模块应用 phalcon project eva --type modules入口文件为public/index.p ...
随机推荐
- ios菜鸟总结2
这个星期学起oc来可能是最纠结的.话不多说先补充一下上一个星期的快捷键吧.工程导航器:Command+1 显示/隐藏导航器面板:Command+0 .显示/隐藏实用工具面板:Command+Op ...
- Java学习笔记——字符串常用函数
class JavaTest4_String { public static void main(String[] args) { String str1 = "IOS,ANDROID,BB ...
- Oracle基础 (十二)数学函数
数学函数: ABS(n):求绝对值 ),) FROM DUAL; --获取15的绝对值 结果:, BITAND(X,Y):返回X,Y进行位与(AND)的运算结果 ,), BITAND(,), BITA ...
- JQuery方法扩展
第一种 extend <!-- extend 扩展jQuery,其实就是增加一个静态方法 --> 定义: $.extend({ sayHello:function(name) { aler ...
- Win10环境下使用VS2015编译PJProject
一.pjproject源码下载 下载地址:http://www.pjsip.org/ 二.编译之前 1.pj配置,通常直接复制并重命名config_site_simple.h为config_site. ...
- WebStorm10下载、安装
WebStorm是最专业的前端IDE开发工具 官网下载:http://www.jetbrains.com/webstorm/ 配置和快捷键
- 用原生js模仿jquery
阅读声明:本文档仅供学习,由于个人能力有限,文档中有错漏的地方还请指出,大家共同学习. 目前在学习怎么样写jquery,模仿阶段,有兴趣的同学可以和我一起学习,共同交流,在学习的路上希望有你做伴. 在 ...
- 物联网 WIFI 一键配置原理(smartconfig) ESP8266/QCA4004
自从物联网 问世以来,如何使得物 能够联网 有了很多的方式,目前运用非常广的WIFI,今天就总结下自这个方面,也对于有需要的盆友 也希望有抛砖引玉之效果. 物联网: 智能硬件+APP+云 APP ...
- SQL循环
加群学习:457351423 这里有4000多部学习视频,有需要的欢迎进群学习! declare @temp Table ( nf varchar(50), yf varchar(50), sm va ...
- SQL Server 2008复制发布订阅(数据同步)
数据库同步问题 1.有一台主数据库服务器A和另外一台数据库服务器B,客户端首先访问数据库B,当B数据库服务器挂掉时就访问A,当对数据库B进行DML操作时,同时对A进行更新,如果A与B之间通讯失败,则将 ...