MVC控制器(ZendController).ppt

上传人:牧羊曲112 文档编号:6512836 上传时间:2023-11-08 格式:PPT 页数:40 大小:267.99KB
返回 下载 相关 举报
MVC控制器(ZendController).ppt_第1页
第1页 / 共40页
MVC控制器(ZendController).ppt_第2页
第2页 / 共40页
MVC控制器(ZendController).ppt_第3页
第3页 / 共40页
MVC控制器(ZendController).ppt_第4页
第4页 / 共40页
MVC控制器(ZendController).ppt_第5页
第5页 / 共40页
点击查看更多>>
资源描述

《MVC控制器(ZendController).ppt》由会员分享,可在线阅读,更多相关《MVC控制器(ZendController).ppt(40页珍藏版)》请在三一办公上搜索。

1、第3章 MVC控制器(Zend_Controller),MVC控制器Zend_Controller组件是Zend Framework中实现MVC模式的灵魂。它是Zend Framework的MVC体系中最核心的部分。本章来介绍Zend_Controller组件的使用。通过本章内容,读者对于如何使用Zend_Controller控制器以及使用Zend Framework编写MVC模式的程序会有一个深刻的认识。,3.1 Zend_Controller入门,Zend_Controller是Zend Framework的MVC体系的核心部分。MVC指Model-View-Controller,是一个用

2、于分离应用逻辑和表现逻辑的设计模式。Zend_Controller组件中的Zend_Controller_Front(前端)类实现了前端控制器设计模式。在该种设计模式下所有的请求都通过前端控制器(front controller)并分发(dispatch)到不同的控制器来处理,分发的过程基于请求的URL。Zend_Controller体系具有可扩展性,可以通过继承已有的类或者自己写个新的类来实现各种接口和抽象类,也可以编写插件或者助手类(helper)来增强系统的功能。,3.1.1 目录结构,使用Zend_Controller进行MVC编程,需要使用特定的目录结构。,3.1.2 创建入口程序,

3、使用Zend_Controller进行MVC编程,首先需要创建一个Bootstrap。所谓Bootstrap,就相当于一小段引导程序或者入口程序。在Zene Framework中,通常指index.php。因为所有的请求都是从index.php进入的。在设置好.htaccess文件之后,建立一个新的文件index.php,并输入以下代码。?phprequire_once Zend/Controller/Front.php;Zend_Controller_Front:run(./application/controllers);这是一个入口文件,目的在于启动Zend_Controller_Fro

4、nt。Zend_Controller_Front,用于分配请求到不同的控制器。,3.1.3 创建默认的控制器,在讨论控制器之前,应该先理解Zend Framework是如何处理HTTP请求的。默认情况下,URL的第一个部分会映射到一个控制器,第二个部分则映射到控制器类中的Action(即控制器类内部的一个方法)。,3.1.4 创建视图文件,上一小节介绍默认控制器时曾经介绍过,视图脚本(即模板文件)放在application/views/scripts/目录下,而默认的模板是application/views/scripts/index/index.phtml。,3.2 Zend_Control

5、ler基础,Zend_Controller工作流用若干组件来实现。在实际编程过程中不需要完全理解所有组件的工作机制,但简要了解其工作流程也是很有必要的。Zend_Controller工作流程包括以下几类组件。1Zend_Controller_Front(控制器前端)2Zend_Controller_Request_Abstract(控制器请求抽象类)3Zend_Controller_Router_Interface4Zend_Controller_Dispatcher_Interface5Zend_Controller_Action6Zend_Controller_Response_Abstr

6、act,3.3 前端控制器,Zend_Controller_Front实现了模型-视图-控制器(MVC)应用程序的前端控制器模式。目的在于初始化请求环境,并接收路由到来的请求,接着分发任何发现的动作;收集所有的响应,在整个过程完成时将响应内容返回。Zend_Controller_Front也实现了单件(Singleton)模式,意味着任何时候,都只可能有一个有效实例。这使得它可以作为注册表,供分发过程中的其他对象引用。Zend_Controller_Front自己注册了一个插件经纪人类(plugin broker),允许插件观测它所触发的各种事件。大多数情况下,这将使得开发人员有机会裁剪站点的

7、分发过程,而无需通过扩展前端控制器增加功能。前端控制器至少需要一个或多个包含动作控制器的目录的路径来完成工作。还有大量的方法可供其调用,进一步处理前端控制器以及相应的助手类。,3.3.1 常用方法,前端控制器有很多建立其环境的访问器。但是,有三个是开启前端控制器功能的主要方法:getInstance()方法、setControllerDirectory()和addControllerDirectory()方法、dispatch()方法,下面分别介绍这些方法。1getInstance()方法2setControllerDirectory()方法和 addControllerDirectory()

8、方法3dispatch()方法4run()方法,3.3.2 环境访问器方法,除了上节所列的方法以外,还有很多访问器方法可以影响前端控制器环境因而也影响前端控制器代理(delegate)的类的环境。这些方法主要有以下几类。resetInstance()方法(set|get)DefaultControllerName()方法(set|get)DefaultActionName()方法(set|get)Request()方法(set|get)Router()方法(set|get)BaseUrl()方法(set|get)Dispatcher()方法(set|get)Response()方法regist

9、erPlugin方法unregisterPlugin($plugin)方法throwExceptions($flag)方法returnResponse($flag)方法,3.3.3 前端控制器参数,前端控制器可以用做各种控制器组件的注册表。它通过一个“param”家族的方法来事先。这些方法允许通过前端控制器注册任意类型的数据对象和变量,可以在分发链中的任何时候获取。这些变量被传递到路由器、分发器以及动作控制器。这些方法包括以下几类。setParam($name,$value)方法setParams(array$params)方法getParam($name)方法getParams()方法cle

10、arParams()方法,3.3.4 继承前端控制器,要继承前端控制器,至少需要覆盖getInstance()方法。,3.4 请求对象,请求对象是在前端控制器、路由器、分发器以及控制类间传递的简单值对象。请求对象封装了请求的模块、控制器、动作以及可选的参数,还包括其他的请求环境,如HTTP、CLI、PHP-GTK(等)。,3.4.1 访问请求对象,可以通过以下方法来对请求对象进行访问。模块名可通过getModuleName()方法和setModuleName()方法访问。控制器名可通过getControllerName()方法和setControllerName()方法访问。控制器调用的动作名

11、称可通过getActionName()方法和setActionName()方法访问。可选参数是一个键值对的关联数组。该数组可通过getParams()方法和setParams()方法获取及设,3.4.2 访问HTTP请求数据,Zend_Controller_Request_Http封装了对相关值的访问,如控制器和动作路由器变量的键名和值、从URL解析的附加参数等。该类还允许访问作为公共成员的超全局变量,管理当前的基地址(Base URL)和请求URI。超全局变量不能在请求对象中赋值,但可以通过setParam()方法/getParam()方法设定/获取用户参数。,3.4.3 访问HTTP请求基

12、地址与子目录,Zend_Controller_Request_Http允许在子目录中使用Zend_Controller_Router_Rewrite(重定向)。Zend_Controller_Request_Http试图自动地检测基地址,并进行相应的设置。,3.4.4 子类化请求对象,所有请求对象的基请求类是抽象类Zend_Controller_Request_Abstract。,3.5 路由器的使用,Zend_Controller_Router_Rewrite是标准的框架路由器。路由是个过程,在这个过程中它取出URI的端点(跟着基本URL的URI的那部分)并把它分解成参数来决定哪个模块、哪个

13、控制器和控制器中的哪个动作应该接受请求。模块、控制器、动作和其他参数被打包到Zend_Controller_Request_Http对象。接着这个对象由Zend_Controller_Dispatcher_Standard来处理。路由只发生一次:当请求最初被接收和第一个控制器被派遣之前。,3.5.1 路由器的工作环境,Zend_Controller_Router_Rewrite被设计来考虑使用纯php结构时mod_rewrite-like的功能性。该组件可以非常宽松地基于Ruby on Rails(Ruby On Rails是一个用于编写网络应用程序的软件包。它基于一种计算机软件语言Ruby,

14、给程序开发人员提供了强大的框架支持。开发者可以用比以前更少的代码和更短的时间编写出网络软件),并且不要求任何先前的Web服务器URL rewriting的知识。,3.5.2 使用路由器,为正确使用rewrite路由器,必须对其进行初始化操作。创建路由器可以通过前端控制器实例的getRouter()方法来实现。该方法不需要任何参数,直接进行调用即可。执行该方法可以返回一个Zend_Controller_Router_Rewrite对象。在创建过路由器之后还需要添加一些用户定义的路由并注入到控制器。该项操作,可以通过Zend_Controller_Router_Rewirite对象的addRout

15、e()方法来实现,该方法的语法格式如以下代码所示。addRoute($name,$route),3.5.3 基本的路由操作,RewriteRouter的核心是用户定义路由的定义。路由通过调用RewriteRouter的addRoute方法并传递一个由类实现的Zend_Controller_Router_Route_Interface实例被添加。上一节的代码3-2.php中对该方法有所涉及。Rewrite路由器带有四个基本类型的路由(其中一个是特殊的):Zend_Controller_Router_Route,框架路由;Zend_Controller_Router_Route_Static,静态

16、路由;Zend_Controller_Router_Route_Regex,正则路由;缺省路由。,3.5.4 四种基本路由,上一小节在介绍基本路由操作时,曾经介绍过Rewrite路由器带有四个基本类型的路由。本小节就来详细介绍这四种基本类型的路由。1缺省路由2标准框架路由3静态路由4正则表达式路由,3.6 分发器,分发是取得请求对象,提取其中的模块名、控制器名、动作名以及可选参数,然后实例化控制器并调用其中的动作的整个过程。如果其中的模块、控制器或者动作没能找到,将使用默认值。Zend_Controller_Dispatcher_Standard指定每个控制器和动作的默认值为index,模块的

17、默认值为default。该类允许开发者通过setDefaultController()方法、setDefaultAction()方法和setDefaultModule()方法改变默认值设定。,3.6.1 分发概述,分发发生在前端控制器中的一个循环(loop)中。分发之前,前端控制器通过路由请求,找到用户指定的模块、控制器、动作和可选参数。然后进入分发循环,分发请求。每次迭代(iteration)过程开始时,在请求对象中设置一个标志指示该动作已分发。如果在动作或者前/后分发(pre/postDispatch)插件重置了该标志,分发循环将继续下去并试图分发新的请求。通过改变请求中的控制器或者动作并

18、重置已分发标志,开发人员可以定制执行一个请求链。控制这种分发过程的动作控制器方法是_forward();在任意的pre/postDispatch()或者动作中调用该方法,并传入动作、控制器、模块以及可选的附加参数,就可以进入新的动作。,3.6.2.子类化分发器,Zend_Controller_Front首先调用路由器找到请求中的第一个动作,然后进入分发循环,调用分发器分发动作。分发器需要大量数据完成任务它需要知道如何格式化控制器和动作的名称,到哪儿找到控制器类文件,模块名是否有效,以及基于其他可用信息判定的请求是否能被分发等。,3.7 动作控制器,在Zend_Controller中,使用Zen

19、d_Controller_Action子类来实现动作控制器。Zend_Controller_Action是一个抽象类。当基于模型视图控制器(MVC)模式建立网站的时候,可以用该子类和前端控制器一起使用来实现动作控制器。,3.7.1 动作控制器简介,为使用Zend_Controller_Action,需要在实际的控制器类中把它子类化(或者为动作控制器创建自己的基本类而使它子类化)。最基本的操作是子类化和创建对应于不同动作的动作方法,这些动作是希望控制器来处理你的站点的动作。Zend_Controller的路由和派遣处理将在你的类里自动发现任何以“Action”结尾的方法作为潜在的控制器动作。,3

20、.7.2 对象初始化,使用Zend_Controller_Action的构造方法可以实现对象实始化。Zend_Controller_Action:_construct()执行一些重要的任务,如注册请求和响应对象,获取从前端控制器传来的invocation参数等。如果需要重写构造函数,应该调用parent:_construct($request,$response,$invokeArgs)方法。初始化对象更合适的方法来定制实例化是使用init()方法。该方法是在_construct()里的最后一个调用任务。,3.7.3 访问器,动作控制器可以包括很多其他内容,如:请求对象、响应对象、调用参数、请

21、求参数等。这些内容都可以通过相应的访问器方法进行访问。请求对象可以通过getRequest()方法来获取,该方法将返回一个Zend_Controller_Request_Abstract实例。响应对象可以通过getResponse()方法来获取,该方法将返回一个Zend_Controller_Response_Abstract实例。在获取响应对象之后,可以使用该类的方法对其进行诸如设置头信息(setHeader())、应用主体(appendBody())内容等操作。前端控制器可能把一些调用参数传给路由器、分发器和动作控制器。使用getInvokeArg($key)方法可以读取这些参数。另外,使

22、用getInvokeArgs()可以读取整个参数列表。,3.7.4 视图集成方法,Zend_Controller_Action为视图继承提供了一个初步的灵活的机制。有两个方法来完成该操作:initView()和render();前者松散地加载$view public 属性,后者基于当前请求的动作来解析视图。这两种方法都使用目录层次来决定脚本路径。1视图初始化2解析视图,3.7.5 其他实用方法,Zend_Controller_Action除了访问器和视图继承方法外,在动作方法内部,Zend_Controller_Action有若干实用方法来执行普通的任务(或在派遣的前后)。_forward()

23、方法。_forward($action,$controller=null,$module=null,array$params=null)_redirect()方法。_redirect($url,array$options=array(),3.8 动作助手,动作助手可以向任何Zend_Controller_Action的衍生动作控制器中,即时加入功能(runtime and/or on-demand functionality),以使得增加公共的动作控制器功能时,尽量减少衍生动作控制器类的必要。动作助手有多种使用方式,它使用了一套经纪系统(brokerage system),与Zend_View

24、_Helpers(视图助手)中使用的也就是Zend_Controller_Plugin的经纪系统类似。动作助手在需要调用时加载,可以在请求的时候或者动作控制器创建的时候进行实例化。,3.8.1 初始化动作助手,根据需求以及助手的功能,可有几种不同的初始化方式。助手经纪人(broker)存储在Zend_Controller_Action动作控制器的$_helper成员中。可以使用经纪人来获取或者调用助手。以下是几种常见的操作方法。显式调用getHelper()方法使用助手经纪人的魔术_get()方法最后,大部分动作助手实现了direct()方法,3.8.2 助手经纪人,助手经纪人,即Zend_C

25、ontroller_Action_HelperBroker类。该类处理注册助手对象和助手路径,即时的获取助手等细节。使用addHelper方法可以注册助手。该方法的语法格式如以下代码所示。addHelper(Zend_Controller_Action_Helper_Abstract$helper)以上代码中,参数$helper为一个Zend_Controller_Action_Helper对象实例。执行该方法将向助手经纪人中注册助手。实例化一个助手并传入经纪人相对来说有点耗费时间和资源。不过使用静态方法addPrefix()和addPath()两个方法能够很容易的自动完成这些工作。addPr

26、efix($prefix)以上代码中参数$prefix为一个类的前缀,以字符串表示。执行该方法将用来加入自定义助手类的路径。该方法假定前缀遵循Zend Framework的类命名惯例。addPath($path,$prefix=Zend_Controller_Action_Helper)该方法第一个参数为一个目录,以字符串表示;第二个参数为类的前缀(默认为Zend_Controller_Action_Helper),执行该方法将用自己的类前缀映射到指定的目录。,3.8.3 内建的动作助手,Zend Framework中默认包含三个动作助手:FlashMessenger用来处理Flash Mes

27、senger会话;Redirector提供另一种实现方式,帮助程序重定向到内部或者外部页面;ViewRenderer自动的完成在控制器内建立视图对象并渲染视图的过程。下面分别对这三种内建动作助手进行介绍。1FlashMessenger2Redirector3ViewRenderer,3.9 响应对象,响应对象逻辑上是请求对象的搭档。目的在于收集消息体和/或消息头,因而可能返回大批的结果。另外前端控制器可能传递任何异常到响应对象,允许开发人员优美的处理异常。可以通过设置Zend_Controller_Front:throwExceptions(true)覆盖这项功能。,3.9.1 使用方法,如果

28、要发送响应输出包括消息头,使用sendResponse()。$response-sendResponse();,3.9.2 处理消息头,如本节引文中所描述的,响应对象的一项重要职责是收集和发出HTTP响应消息头。所以该类中存在大量的方法,用于完成引集和发出HTTP响应消息头的操作。该类方法有如下几种。canSendHeaders()方法setHeader($name,$value,$replace=false)方法setRedirect($url,$code=302)方法getHeaders()方法clearHeaders()方法setRawHeader()方法getRawHeaders()方

29、法clearRawHeaders()方法clearAllHeaders(),3.9.3 命名片段,响应对象支持“命名片段”,该机制允许将消息体分割成不同的片段,并呈一定顺序排列。因此输出的是以特定次序返回的。在其内部,主体内容被存储为一个数组,大量的访问器方法可以用来指示数组内的位置和名称。处理命名片段的方法有以下几类。setBody()方法和appendBody()方法prepend($name,$content)方法append($name,$content)方法insert($name,$content,$parent=null,$before=false)方法clearBody($name=null)方法getBody($spec=false)方法,3.10 小结,本章介绍了Zend Framework中的Controller组件。该组件是MVC中最为重要的组件,只有熟练掌握并使用该组件才能写出高效的MVC程序。本章只对Zend_Controller做了理论上的讲解,本书第37将通过具体实例来使用控制器组件以及相关的视图组件等内容。,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号