分享
 
 
 

php.MVC系列教程之控制器

王朝php·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

控制器(Controller)由一些类组成,根据预先定义的配置选项处理用户请求。一个典型的用户请求如下:

http://www.myhost.com/mycompany/Main.php?do=salesReport.

php.MVC 控制器由两部分组成:前端控制器和控制器。当请求到来时,前端控制器负责安装应用程序,控制器则根据phpmvc-config.xml的配置属性处理请求。

图6显示了前端控制器的主要任务。

图6

用户请求被Main.php文件接收,这里,将设置一些初始化参数。前端控制器将执行以下任务:

定义应用程序路径:这将指定php.MVC类库以及Web应用程序的路径,如下:

$appServerRootDir = 'C:/WWW/phpmvc-base';

$moduleRootDir = 'C:/WWW/mycompany';

定义应用程序的ActionDispatcher:我们通常需要扩展框架ActionDispatcher来定义自己的Dispatcher类:

$actionDispatcher = 'MyActionDispatcher';

初始化应用程序类路径:为了将类和资源装入,前端控制器将导入预先定义的全局路径以及应用程序路径。我们可以在/WEB-INF/ModulePaths.php中设置路径,如下:

$appDirs = array();

...

$appDirs = 'WEB-INF/report_tpl';

$appDirs = 'WEB-INF/report_classes';

包含应用程序类:前端控制器将导入它所需要的类文件,我们也可以用/WEB-INF/prepend.php文件来有选择性地导入一些特殊的应用程序类文件。如下:

include_once './WEB-INF/mytools/MyTools.php';

配置应用程序:前端控制器将为应用程序设置配置信息,比如我们先前定义的ActionDispatcher。

初始化控制器:前端控制器现在将创建一个应用服务器实例(ActionServer)。

导入配置信息:前端控制器现在将导入应用程序配置信息,假如phpmvc-config.xml从最后一次请求后被修改了,phpmvc-config.xml文件将被重新处理并将数据缓存到/WEB-INF/phpmvc-config.data中。

初始化HTTP请求:前端控制器现在将设置HTTP请求并添加请求属性。

调用应用程序控制器:前端控制器现在已经完成了准备工作,将会把处理权交给控制器。

控制器接收从前端控制器传来的请求,根据配置属性执行一系列操作。

图7描述了php.MVC控制器的任务。

图7

处理action路径:控制器将根据请求路径识别出关键字,选择一个action映射。比如请求路径为:

http://www.myhost.com/mycompany/Main.php?do=salesReport, action路径就为salesReport。

处理现场:根据需要为当前用户选择一个Locale

处理内容格式:根据需要设置内容格式,默认为text/html。

处理不缓存:根据需要设置不缓存头信息,默认为:

"Pragma", "No-cache"

"Cache-Control", "no-cache"

"Expires", 1

处理预处理任务:可以在自定义的ActionServer子类中覆盖这个方法,执行一些指定的预处理任务。

处理Action映射:控制器将根据请求识别action映射,根据phpmvc-config.xml的相应节点生成action映射对象(ActionConfig),比如:<action path = "salesReport" .../>。

处理角色:检查能执行这个action的所有必须的认证。

处理ActionForm:控制器将根据action映射找到相关联的ActionForm,form-bean就是由action的name属性指定,比如:

<action ... name = "salesReportForm" .../>。

处理Populate:根据请求参数设置ActionForm实例的属性。

验证ActionForm:根据action的validate属性值如:<action validate = "true" .../>,决定是否调用ActionForm的validate()方法。如果validate()返回False(验证失败),控制器将用action中input属性所指定的显示资源(模板)显示错误,比如:

<action path = "salesReport"

...

validate = "true"

input = reportsIndex.tpl>

假如validate()返回True(验证通过),则将继续处理。处理Forward:控制器检查forward映射的URI是否正常,如果是,继续处理。

处理Include:控制器检查include映射的URI是否正常,如果是,继续处理。

处理Action创建:控制器将创建或获取Action实例来处理这个请求,这是用action的type属性来定义的,比如:

<action path = "salesReport"

type = "SalesReportAction"

...

处理Action执行:控制器现在将调用Action类的execute()方法,比如SalesReportAction->execute(...)。在该方法内,我们将调用业务处理逻辑类。

处理Action链:控制器将检查是否还有另外一个Action需要处理,在应用程序配置文件中,我们通过ActionChain能定义一系列Action,为了定义ActionChain,需要为action节点的forward元素添加一个nextActionPath属性,比如:

<action path = "salesReport"

type = "SalesReportAction"

...

<forward

name = "salesReportSuccess"

path = "salesReport.tpl"

nextActionPath = "salesReport2"/>

...

forward元素的path属性是必须项,假如这个特殊的Action没有输出,我们可以设置path = ""。

处理Action Forward:控制器将转发或重定向到指定的资源,一个forward请求在当前处理器中被处理。RequestProcessor只是把控制权交给ActionDispatcher,那里包含了指定的URI模板。比如:

<forward

name="forward_path

path="forwardRequest"

redirect="false"/>

重定向请求实际是发送给客户端浏览器一个标头响应,然后重定向到一个新的URL。在发送重定向标头信息时当前的处理将立即终止。

<!-- This server -->

<forward

name="redirect_path

path="/MyApp/Main.php?do=newRequest"

redirect="true"/><!-- This server, or a remote server -->

<forward

name="redirect_path

path="http://www.myhost.com/MyApp/Main.php?do=newRequest"

redirect="true"/>

假如没有其他的Action需要处理,控制器处理结束。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有