Zend的MVC机制使用分析(二)


Posted in PHP onMay 02, 2013

接着上面的一篇

把代码贴上来

$front = Zend_Controller_Front::getInstance(); 
Zend_Layout::startMvc(array('layoutPath' => USVN_LAYOUTS_DIR)); $front->setRequest(new Zend_Controller_Request_Http()); 
$front->throwExceptions(true); 
$front->setBaseUrl($config->url->base); 
$router = new Zend_Controller_Router_Rewrite(); 
$routes_config = new USVN_Config_Ini(USVN_ROUTES_CONFIG_FILE, USVN_CONFIG_SECTION); 
$router->addConfig($routes_config, 'routes'); 
$front->setRouter($router); 
$front->setControllerDirectory(USVN_CONTROLLERS_DIR); 
$front->dispatch();

上一篇把前两句getInstance和startMvc两个函数已经读完了,下面是继续分析后面的代码

setRequest($request) 这里是判断request是否是继承自Zend_Controller_Request_Abstract,如果是的话就把front的_request赋值为它。

这里需要了解下什么是Zend_Controller_Request_Abstract,它是所有request抽象出来的抽象类。Zend已经提供了两个实现类,Zend_Controller_Request_Http和Zend_Controller_Request_Simple,一般我们搭建服务器都是http请求,所以你的项目如果需要重新继承的话,一般都直接继承Zend_Controller_Request_Http。

Zend_controller_Request_Http中我们经常会使用到的getQuery,getCookie,getRequestUri,getBasePath,getParams,getHeader等这些Http通常的选项都已经有了。

继续讲它的基类Zend_Controller_Request_Abstract,这个类的方法包含:
Zend的MVC机制使用分析(二)

回到代码
 

$front->setRequest(new Zend_Controller_Request_Http());这里调用了Zend_Controller_Request_Http的构造函数,构造函数在第一次调用的时候是$this->setRequestUri();其中的setRequestUri很多都是直接使用$_SERVER这个php全局变量中的数据来获取requestUri的。

setRequestUri可以学到的是在不同的服务器中如何获取requestUri(特别是在IIS中的$SERVER中不同的变量组合有不同的含义),比如http://172.23.11.160/usvn/item/usvn_test 这个url,它的requestUri就是/usvn/item/usvn_test

 

$front->throwExceptions(true); 将内部的_throwExceptions标志位设置为true;

$front->setbaseUrl("/usvn")这个做了两件事情,首先是设置front内部的_baseUrl属性,其次调用Request的setBaseUrl,也是设置Zend_Controller_Request_Http的内部_baseUrl属性。

$router = new Zend_Controller_Router_Rewrite();

$routes_config = new USVN_Config_Ini(USVN_ROUTES_CONFIG_FILE, USVN_CONFIG_SECTION);

$router->addConfig($routes_config, 'routes');

$front->setRouter($router);

下面这三行就直接说,实际上就是使用Zend的Router模块使用配置文件,router使用setRouter放入front里面。

最后一句

$front->dispatch();

这个函数也是最核心的一个函数。

这个函数首先注册了一个插件Zend_Controller_Plugin_ErrorHandler,index为100,把插件的顺序放在最后。

 

第二步存放了一个Helper,Zend_Controller_Action_Helper_ViewRenderer,index为-80

下面实例化了request,request是一个Zend_Controller_Request_Http类型。并将request的baseUrl设置为前面设置过的_baseUrl,就是"/usvn/item/usvn_test"

接着实例化了response,response是一个Zend_Controller_Response_Http();

下面使用plugins来对Request和Response进行设置,首先实际调用了Zend_Controller_Plugin_Broker的setRequest函数,这个函数循环遍历broker管理的所有插件,调用插件的setRequest($request)函数(如果有的话)。

 

接下来初始化router,和设置router的参数。router已经在前面设置过了,就是Zend_Controller_Router_Rewrite类型

初始化分发器dispatcher,分发器我们是第一次看到,Zend_Controller_Dispatcher_Standard类。分发器以后再说。

下面的流程:

调用插件的routeStartup对request进行处理

调用router的route处理request

调用插件的routeShutdown对request进行处理

调用插件的dispatchLoopStartup对request进行处理

进入循环分发过程

调用插件的preDispatch对request进行处理

调用dispatcher的dispatch处理request和response

调用插件的postDispatch对request进行处理

跳出循环分发过程

调用插件的dispatchLoopShutdown对request进行处理

发送response
Zend的MVC机制使用分析(二)

PHP 相关文章推荐
Win2000+Apache+MySql+PHP4+PERL安装使用小结
Oct 09 PHP
用PHP 快速生成 Flash 动画的方法
Mar 06 PHP
php+mysql分页代码详解
Mar 27 PHP
php中Y2K38的漏洞解决方法实例分析
Sep 22 PHP
PHP实现QQ空间自动回复说说的方法
Dec 02 PHP
PHP扩展框架之Yaf框架的安装与使用
May 18 PHP
PHP7新增运算符用法实例分析
Sep 26 PHP
iOS+PHP注册登录系统 PHP部分(上)
Dec 26 PHP
yii2-GridView在开发中常用的功能及技巧总结
Jan 07 PHP
Ajax+PHP实现的模拟进度条功能示例
Feb 11 PHP
php上传后台无法收到数据解决方法
Oct 28 PHP
PHP 对象接口简单实现方法示例
Apr 13 PHP
Zend的MVC机制使用分析(一)
May 02 #PHP
基于Zend的Captcha机制的应用
May 02 #PHP
PHP静态调用非静态方法的应用分析
May 02 #PHP
Mysql中分页查询的两个解决方法比较
May 02 #PHP
记录mysql性能查询过程的使用方法
May 02 #PHP
基于MySQL分区性能的详细介绍
May 02 #PHP
php中使用$_REQUEST需要注意的一个问题
May 02 #PHP
You might like
PHP在引号前面添加反斜杠(PHP去除反斜杠)
2013/09/28 PHP
php日志函数error_log用法实例分析
2019/09/23 PHP
Laravel 之url参数,获取路由参数的例子
2019/10/21 PHP
jquery 入门教程 [翻译] 推荐
2009/08/17 Javascript
Google排名中的10个最著名的 JavaScript库
2010/04/27 Javascript
javascript 面向对象 function类
2010/05/13 Javascript
JS实现图片翻书效果示例代码
2013/09/09 Javascript
Jquery 实现弹出层插件
2015/01/28 Javascript
AngularJS中的Directive自定义一个表格
2016/01/25 Javascript
canvas压缩图片转换成base64格式输出文件流
2017/03/09 Javascript
jQuery日期范围选择器附源码下载
2017/05/23 jQuery
了解VUE的render函数的使用
2017/06/08 Javascript
AngularJS 控制器 controller的详解
2017/10/17 Javascript
react-redux中connect的装饰器用法@connect详解
2018/01/13 Javascript
解决vue打包css文件中背景图片的路径问题
2018/09/03 Javascript
如何解决webpack-dev-server代理常切换问题
2019/01/09 Javascript
JS实现倒序输出的几种常用方法示例
2019/04/13 Javascript
详解如何使用nvm管理Node.js多版本
2019/05/06 Javascript
Vue组件间通信 Vuex的用法解析
2019/08/05 Javascript
javascript刷新父页面方法汇总详解
2019/10/10 Javascript
微信小程序实现点击图片放大预览
2019/10/21 Javascript
Python selenium 三种等待方式详解(必会)
2016/09/15 Python
Python笔试面试题小结
2019/09/07 Python
Win10里python3创建虚拟环境的步骤
2020/01/31 Python
Python使用20行代码实现微信聊天机器人
2020/06/05 Python
python爬取2021猫眼票房字体加密实例
2021/02/19 Python
Carter’s OshKosh加拿大:购买婴幼儿服装和童装
2018/11/27 全球购物
英国排名第一的停车场运营商:NCP
2019/08/26 全球购物
Prototype如何为一个Ajax添加一个参数
2015/12/06 面试题
玩具公司的创业计划书
2013/12/31 职场文书
《大江保卫战》教学反思
2014/04/11 职场文书
罗马假日观后感
2015/06/08 职场文书
大学三好学生主要事迹范文
2015/11/03 职场文书
Vue3.0 手写放大镜效果
2021/07/25 Vue.js
原型和原型链 prototype和proto的区别详情
2021/11/02 Javascript
Golang原生rpc(rpc服务端源码解读)
2022/04/07 Golang