zoukankan      html  css  js  c++  java
  • Zend-MVC事件

      ZendMvcMvcEvent继承自ZendEventManagerEvent,在ZendMvcApplication::bootstrap()执行时触发。如果你的控制器实现了ZendMvcInjectApplicationEventInterface,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")

    监听器:ZendMvcViewHttpViewManager,onBootstrap方法会被调用。

    作用:准备好视图层(也就是实例化ZendMvcViewHttpViewManager)。

    触发方式:ZendMvcApplication  bootstrap()方法。

    MvcEvent::EVENT_ROUTE("route")

    监听器1:ZendMvcModuleRouteListener::onRoute

    作用:决定了模块命名空间是否应该添加在控制器名字前面,主要是防止路由匹配包含的参数键匹配到了MODULE_NAMESPACE常量

    监听器2:ZendMvcRouteListener::onRoute  如果没有路由没有匹配到MvcEvent::EVENT_DISPATCH_ERROR会被触发。

    作用:尝试将request匹配到路由器,并返回一个RouteMatch对象。

    触发方式:ZendMvcApplication::run

    作用:如果路由过程中有错误发生,将会使用一个短回路的回调来停止事件持续传播

    MvcEvent::EVENT_DISPATCH("dispatch")

    监听器分为两类:一类时只限于控制台环境,还有一类只限于HTTP环境,还有全坏境适用的监听器。本文不介绍CONSOLE环境。console环境可以查看官方文档。

    类ZendMvcViewHttpCreateViewModelListener里面有两个函数作为本事件的监听器:

    1、createViewModelFromArray(如果控制器行为返回一个关联数组,该监听器将数组转化为一个ViewModel对象。

    2、createViewModelFromNull(控制器返回的时一个空值,则该方法将其转化为一个ViewModel对象)

    类ZendMvcViewHttpRouteNotFoundStrategy::prepareNotFoundViewModel 创建并返回一个404ViewModel

    类ZendMvcViewHttpInjectTemplateListener::injectTemplate 把一个模版注入到视图模型中。模版名继承自路由匹配的控制器名(或是控制器里的action)

    类ZendMvcViewHttpInjectViewModelListener::injectViewModel 插入一个ViewModel并添加至MvcEvent对象。有两种情况:a)作为子对象加入,包含view model。b)结果可终止的情况下替换掉默认情况

    类ZendMvcMiddlewareListener::onDispatch会触发MvcEvent::EVENT_DISPATCH_ERROR,从service manager里面加载并调度匹配到的PSR-7中间件。

    类ZendMvcDispatchListener::onDispatch会触发MvcEvent::EVENT_DISPATCH_ERROR作用同上。

    类ZendMvcControllerAbstractController::onDispatch本方法是一个抽象类。

    触发方式:

    ZendMvcApplication::run使用短回路的回调来终止事件的传播。(路由时有错误发生时)

    ZendMvcControllerAbstractController::dispatch如果有监听器返回一个Response对象,将终止事件传播。每当AbstractController监听本事件的时候,被触发时都会调用onDispatch方法。

    MvcEvent::EVENT_RENDER("render")

    监听器:

    ZendMvcViewConsoleDefaultRenderingStrategy::render 用来渲染视图

    ZendMvcViewHttpDefaultRenderingStrategy::render同样渲染视图,注意和上面的环境区别

    触发方式:

    ZendMvcApplication::competeRequest本事件在MvcEvent::FINISH触发前触发。

    MvcEvent::EVENT_FINISH("finish")

    监听器:

    ZendMvcSendResponseListener::sendResponse触发SendResponseEvent来准备response。

    触发方式:

    ZendMvcApplication::run 一旦MvcEvent::ROUTE或MvcEvent::DISPATCH事件返回了一个正确的ResponseInterface就会触发本事件

    ZendMvcApplication::completeRequest触发在MvcEvent::RENDER之后(也就是说,此时视图已经被渲染了)。

    关于SendResponse事件

    ZendMvcResponseSenderSendResponseEvent定义了如下方法:

    setResponse($response)

    getResponse()

    setContentSent()

    contentSent()

    setHeadersSent()

    headersSent()

    这些方法用来设置应答头和应答内容。

    监听器:

    ZendMvcSendResponseListenerPhpEnvironmentResponseSender::__invoke 使用环境HTTP

    ZendMvcSendResponseListenerConsoleResponseSender::__invoke使用环境为console。

    ZendMvcSendResponseListenerSimpleStreamResponseSender::__invoke

    MvcEvent::FINISH事件被触发后本事件执行

  • 相关阅读:
    Python 之pymysql数据库模块
    Python 之sqlite3数据库模块
    Python 之操作sqlite3
    Python 之requests网络请求模块
    Python 之os文件目录模块
    Python 之json模块
    Python 之random随机数模块
    vue.js三种安装方式
    VUE学习之计算属性computed
    vue添加背景音乐
  • 原文地址:https://www.cnblogs.com/san-fu-su/p/5722804.html
Copyright © 2011-2022 走看看