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事件被触发后本事件执行

时间: 2024-11-01 22:47:56

Zend-MVC事件的相关文章

【原创】Zend Framework 2框架之MVC

ZendFramework 2框架之MVC 作者:sys(360电商技术组) 1.前言 Zend Framework 2是zend官方推出的php开源框架,基于php5.3.他全然採用面向对象的代码实现,并利用了php5.3的一些新特性,比方命名空间.闭包等.由于是官方的推荐的,今天我们就来学习学习Zend Framework 2,由于本人知识浅薄,也没有实际的用Zend Framework 2做项目开发的经验.有错误的地方还请大家指正,也希望在后面的开发中能用用该框架,此篇文章权当抛砖引玉.

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

// 1.控制器管理器 class ServiceManager implements ServiceLocatorInterface { public function __construct(ConfigInterface $config = null) { if ($config) { $config->configureServiceManager($this); } } } abstract class AbstractPluginManager extends ServiceMana

zend framework2学习(二)项目配置

项目的基本环境已经调通,下面开始zend framework的相关配置. ------------------------------------------------------------------------------------------------------------------------------------------------- 2.1 添加启动入口文件 在public/index.php中添加如下代码: chdir(dirname(__DIR__));defi

ZendFramework-2.4 源代码 - 关于MVC - View层 - 视图渲染器、视图插件管理器

<?php // 1. 视图渲染器 class PhpRenderer implements Renderer, TreeRendererInterface { /** * 插件管理器 */ public function getHelperPluginManager() { if (null === $this->__helpers) {// false $this->setHelperPluginManager(new HelperPluginManager()); } return

ZendFramework-2.4 源代码 - 关于MVC - View层 - 控制器返回值

<?php class ReturnController extends AbstractActionController { public function returnAction() { // 返回方式一 :会被dipatch处理器Zend\Mvc\View\Http\CreateViewModelListener::createViewModelFromArray(...)的拦截处理 return array('key1' => 'key1value'); // == new View

Zend Framework 2 获取 Service Manager

在学习zend framework的时候很多的问题只能看源代码,为了加深自己的理解,记录下来平时用到的方法: 1在控制器里 $serviceLocator = $this->getServiceLocator(); 2在Module.php里 namespace ModuleName; use Zend\Mvc\MvcEvent; class Module { public function onBootstrap(MvcEvent $e) { $serviceLocator = $e->ge

Zend Framework 2 Service Manager 配置方法

我们通常会把Service Manager配置在两个地方 1.module.config.php 2.Module.php 不同的service manager 类型有不同的配置方法 Application services Manager Application services Manager class Zend\ServiceManager\ServiceManager Config key service_manager Module method getServiceConfig()

Google 地图 API V3 之事件

概述 浏览器中的 JavaScript 是由事件驱动的,这表示 JavaScript 会通过生成事件来响应交互,并期望程序监听感兴趣的事件.Google Maps API V3 的事件模型与 Google Maps API V2 中所使用的事件模型尽管在内在机制上有很大的不同,但两者是十分相似的.有两种类型的事件: 用户事件(如“点击”鼠标事件)是从 DOM 传播到 Google Maps API 中的.这些事件是独立的,并且与标准 DOM 事件不同. MVC 状态更改通知反映了 Maps AP

Zend Framework 2中如何使用Service Manager

end Framework 2 使用ServiceManager(简称SM)来实现控制反转(IoC).有很多资料介绍了service managers的背景,我推荐大家看看this blog post from Evan和 this post from Reese Wilson,但是仍然有很多开发者不能够很好地使用ServiceManager去解决他们的需求.这篇文章我将解释为什么ZF2框架需要使用多个服务管理器以及怎样使用它们.主要包含以下几个方面: 这些不同的服务管理器是什么? 不同的服务管