免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 954 | 回复: 0
打印 上一主题 下一主题

Zend Framework-Zend_Controller工作原理简介 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-11-19 16:02 |只看该作者 |倒序浏览

2.1. 概述
2.1.1. 简介
Zend_Controller是使用MVC模式来构建一个站点的基础。Zend_Controller体系是一个轻量的,模块化和可扩展的体系。它只提 供最核心的必要的部分,允许开发者有很大的自由来灵活地构建自己的站点。使用Zend_Controller的站点,其代码结构会有一部份是相似的。
Zend_Controller 的工作流(workflow)是通过几个组件来实现的。虽然不需要完全理解这几个组件的含义,如果你对工作流程有点了解是很有帮助的:

  • Zend_Controller_Front(前 端控制器)是Zend_Controller_Controller体系的组织者,它是FrontController设计模式的实现。 Zend_Controller_Front处理服务器接受的所有请求,并最后负责将请求分配给ActionController (Zend_Controller_Action)。Zend_Controller_Controller就是将客户的原始请求转发给相应的处理组件(Action)去完成具体的业务处理。

  • Zend_Controller_Router相当于一个路由器。路由是将 一个URI分解并决定由哪一个Controller,和用什么 Action来处理的过程。controller,action和可选的参数的定义,被封装成一个对象-- Zend_Controller_Dispather_Token,然后由Zend_Controller_Dispatcher来处理。路由只发生一 次:当请求被服务器接收到时,在分配到第一个控制器之前。Zend_Controller_Router负责解析客户的请求URI,分析其中的参数,以决定定位到哪个ActionController。Zend_Controller_Router会把分析出的参数封装成Zend_Controller_Dispather_Token对象。
    (所谓router,和我们熟知的网络路由器的功能是很相似的,具有判断网络地址和选择路径的功能,这里就是用来重定向 --Haohappy注)

  • Zend_Controller_Dispatcher 即分配器。
    “分配”的过程即根据Zend_Controller_Dispatcher_Token来查找适合的contoller文件,实例化其中的 controller类(必须实现Zend_Controller_Action),并且最后在控制器内运行action。和路由不同,分配的过程不断重 复的,Zend_Controller_Dispatcher被Zend_Controller_Front不断调用直到所有action都依次分配完 毕。Zend_Controller_Dispatcher是根据Zend_Controller_Router对请求URI的解析结果(一个Zend_Controller_Dispather_Token对象)将请求转发给相应的Zend_Controller_Action。

  • Zend_Controller_Action是最基本的控制器。每个具体的控制器都是从Zend_Controller_Action类继承而来,是Zend_Controller_Action的子类,并且有自己的action方法。Zend_Controller_Action是基本的控制器,真正对一次用户请求进行具体处理的工作是由它来完成的。

    Zend_Controller的工作流程相当简单。Zend_Controller_Front接收一个请求,然后由 Zend_Controller_Router来决定分配给哪个controller(实现Zend_Controller_Action的类)。Zend_Controller_Router把URI分解封装成 一个Zend_Controller_Dispatcher_Token 对象。Zend_Controller_Front接着进入一个分配循环,调用Zend_Controller_Dispatcher,把token对象 传给dispatcher来分配到具体的controller和action进行处理。在controller结束后,又把控制权交加给 Zend_Controller_Front。如果controller发现需要分配另一个controller(返回一个新的token对象),循环会 一直继续直到另一次分配执行完毕。
    Zend_Controller工作流示意图如下:


    2.1.2. Route Process 路由过程
    在你构建第一个控制器之前,你需要理解Zend_Controller_Router中的重定向过程是如何工作的。记住工作流程分为两步:一是重定向(routing),只发生一次;二是分配(dispatching),循环过程。
    Zend_Controller_Front 调用Zend_Controller_Router来使一个URI 映射到一个controller(Zend_Controller_Action类)及其中的action上。 Zend_Controller_Router分解URI,生成一个对象Zend_Controller_Dispatcher_Token,然后再传递 给分配器(Zend_Controller_Dispatcher)。
    router使用很简单的方法来决定所要使用的controller及其action(URI映射到Zend_Controller_Action):
    http://framework.zend.com/controller/action/
    上面controller就是我们要采用的控制器,action就是我们要采用的action。
    其它可选择的GET参数可以在URI中定义,并传递给controller。格式为key/value:
    http://framework.zend.com/controller/action/key1/value1/
    如果/controller/这部分没有写明,默认调用index。 如果/action/这部份没有写,也默认调用index。如:
    http://framework.zend.com/roadmap/future/
    Controller: roadmap
    Action    : future
    http://framework.zend.com/roadmap/
    Controller: roadmap
    Action    : index
    http://framework.zend.com/
    Controller: index
    Action    : index

    注意
    我们正在开发一个新的使用URI重写引擎的router,这样可以更灵活一些。新版本会很快发布。
    controller,action的名称及其它参数将会被封装到一个token对象中-- Zend_Controller_Dispatcher_Token。这个对象被传回到Zend_Controller_Front,然后进入分配过程, 被传递给Zend_Controller_Dispatcher。
    2.1.3. Token对象
    Token对象是个很简单的对象,在Zend_Controller_Front和实现router,dispatcher接口的类间传递。它把controller,action和其它GET参数封装在一起。

  • controller的名称通过getControllerName()及setControllerName()来获得和设置

  • action的名称过getActionName()和setActionName()来获得和设置.

  • 传递给action的参数是个数组(key/value形式),可以通过getParams()来获得,通过setParams()来设置

    2.1.4. Dispatch Process 分配过程
    所谓分配过程,就是根据token对象(Zend_Controller_Dispatcher_Token) ,抽取其中的信息:controller的名称,action的名称,参数等等,然后实例化一个controller,并调用其中的action来进行处 理。



    本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/10346/showart_203116.html
  • 您需要登录后才可以回帖 登录 | 注册

    本版积分规则 发表回复

      

    北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
    未成年举报专区
    中国互联网协会会员  联系我们:huangweiwei@itpub.net
    感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

    清除 Cookies - ChinaUnix - Archiver - WAP - TOP