您好,欢迎访问一九零五行业门户网

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事件被触发后本事件执行
其它类似信息

推荐信息