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事件的更多相关文章

  1. asp.net mvc 事件顺序

    1. OnActionExecuting 2. Before return View() 3. OnActionExecuted 4. OnResultExecuting 5. Hello from  ...

  2. 【原创】Zend Framework 2框架之MVC

    ZendFramework 2框架之MVC 作者:sys(360电商技术组) 1.前言 Zend Framework 2是zend官方推出的php开源框架,基于php5.3.他全然採用面向对象的代码实 ...

  3. 转:Zend Framework 2.0 分析

    文章来自于:http://bbs.phpchina.com/thread-268362-1-1.html ZF2已经发布,与ZF1相比,MVC这一模块内部的实现机制可谓大相径庭,许多用过ZF1的PHP ...

  4. ZendFramework-2.4 源代码 - 关于MVC - Controller层

    // 1.控制器管理器 class ServiceManager implements ServiceLocatorInterface { public function __construct(Co ...

  5. Google 地图 API V3 之事件

    Google官方教程: Google 地图 API V3 使用入门 Google 地图 API V3 针对移动设备进行开发 Google 地图 API V3 之事件 Google 地图 API V3 ...

  6. Phalcon的Mvc结构及启动流程(部分源码分析)

    Phalcon本身有支持创建多种形式的Web应用项目以应对不同场景,包括迷你应用.单模块标准应用.以及较复杂的多模块应用 创建项目 Phalcon环境配置安装后,可以通过命令行生成一个标准的Phalc ...

  7. zend framework分析总结[转]

    版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章原始出版.作者信息和本声明.否则将追究法律责任.http://blog.csdn.net/mayongzhan - 马永占,myz,may ...

  8. Phalcon Framework的MVC结构及启动流程分析

    目前的项目中选择了Phalcon Framework作为未来一段时间的核心框架.技术选型的原因会单开一篇Blog另说,本次优先对Phalcon的MVC架构与启动流程进行分析说明,如有遗漏还望指出. P ...

  9. Phalcon Framework的Mvc结构及启动流程(部分源码分析)

    创建项目 Phalcon环境配置安装后,可以通过命令行生成一个标准的Phalcon多模块应用 phalcon project eva --type modules入口文件为public/index.p ...

随机推荐

  1. oracle冷备份

    windows环境下Oracle数据库冷备份和恢复 1.点击开始菜单的“运行”,输入sqlplus/nolog 2.在弹出的命令行窗口以sysdba身份登陆,要输入:系统用户名/登陆密码@数据库实例名 ...

  2. PHP 错误处理机制

    在日常的项目开发过程中,总是会出现一些我们意想不到的异常错误,如果我们对此没有进行相对完善的处理,那么程序看上去也很不专业,也很可能就会成为别人攻击系统的有效信息:有些错误异常会终止脚本执行,这个时候 ...

  3. 日期字符串转换 and 两个日期相减

    //创建当前日期 NSDate *date = [NSDate date]; //创建日期格式类 NSDateFormatter *dateFormat = [[NSDateFormatter all ...

  4. Hartree-Fock理论(更新中)

    预备知识: 基组 分子轨道基本概念与Hartree Product 平均场与Fock算符 在忽略分子中电子的相互作用时,我们有了一个粗糙的模型,虽然非常容易求解,但是描述的精确程度非常差. 考虑电子的 ...

  5. Part 99 Lambda expression in c#

    class Program { static void Main(string[] args) { List<Person> persons = new List<Person> ...

  6. Struts2_概述

  7. 2015影响因子Excel版

    现在终于有影响因子2015的Excel版了,这个版本除了还包括杂志全称和缩写等基本信息还,包括中科院分区, 应该是迄今2015影响因子最奢华的版本了吧. 看了这个版本,发现中国的SCI杂志还是不少的, ...

  8. [老老实实学WCF] 第八篇 实例化

    老老实实学WCF 第八篇 实例化 通过上一篇的学习,我们简单地了解了会话,我们知道服务端和客户端之间可以建立会话连接,也可以建立非会话连接,通信的绑定和服务协定的 ServiceContract 的S ...

  9. 【学习笔记】Mac OS X系统介绍

    一.Dock *相当于Windows的快速启动栏,用来存放常用软件的图标 *单击软件图标即可打开相应的软件 *右击软件图标还有其他菜单选项:比如退出软件 *图标下边的黑点代表程序正在运行中,并没有完全 ...

  10. 20150323--MVC

    MVC: Model view(视图层,模板) Control(控制层) 三层:数据访问,商业逻辑,用户界面(Webform,MVC). 服务端无状态:接受请求,返回页面,每次请求并返回界面,前后不是 ...