php前端控制器

2021年09月15日 阅读数:1
这篇文章主要向大家介绍php前端控制器,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。

4年之前,当我还在一种叫ASP的东西上工做的时候,我成天为两个问题头疼不已:一是如何将分散的页面控制整合起来。解释型的服务器端脚本,每一个页面都有 接收和处理请求的能力。这样以每一个页面做为独立的单元来处理请求让人感受粒度过小,分散又不爽。二是如何减小重复代码。脚本语言里处理重复代码的灵丹妙药 是include。每一个页面里均可以include header,footer,session checker,屡试不爽。但有一次我很不幸,我要改一下header的名字……
后来投靠了java,用了struts,豁然开朗,就像天空中飘下来几个大字:前端控制器。在这几个字的怀里缠绵已久,回望脚本语言林林总总,到处鲜花烂漫。

前端控制器在《J2EE核心模式》一书中已经完整的定义过了了,再也不复述。下面只是记一下本身在工做中遇到过的前端控制器模式的实例:
1. 解释型脚本的前端控制器的实现:近期接触了一个php项目,打开看了它的index.php,顿时感受醍醐灌 顶,赞叹做者思想精妙不已,一个小小的页面里面作了控制分发和页面Layout处理。用户全部的请求都发送给index.php页面,而后后面加上几个参 数,如action和event。该系统个php文件的关系是经过命名约束来处理的。好比若是action=XXX,那么会有一个 XXX.class.php,一个XXX.page.template.php,还有相关的footer,header,form,content之类的 页面对应文件。当index页面接到请求的时候经过action名字匹配,利用万能的include将对应的class.php加载进来,做为对 action进行处理的command使用。当command处理完之后,而后再把对应的 page.template,footer,header,content加载进来,而后根据event进行处理。全部动做完成后,把组装好的页面返回给 用户。一次控制分发和页面处理就完成了。一个百行的index.php代码就完成了一个完整的前端控制器,整个框架不可谓不轻啊。脚本的灵活性让我这个整 天活在java的xml配置文件里的人好生羡慕啊。
更加完整的解释型前端控制器:用过一个月的ColdFusion,解释型的标签式语言。March II是这个平台上最流行的MVC框架之一。这个框架和struts很是类似,一个配置核心的XML文件。不过解释型脚本的问题在于它们的最小粒度永远都是 独立的一个页面。这个框架接收用户请求的仍是那个index.cfm文件。这个文件会将请求转给March II的核心文件,而且在第一次被调用的时候会初始化一个应用级的变量,来保存系统xml里的信息。而后经过index.cfm后面的参数匹配来处理 action(MarchII叫它listener),event之类的东西。这个系统在实现信息包装、控制分发和页面处理的同时,还实现了拦截器的功 能。在处理action的listener前面加了一个叫filter的东西来处理,来进行过滤用户信息。总体来讲这个框架算是一个比较完整的MVC框 架。也是我见过的比较完整的解释型脚本的框架。

2.JAVA EE里的前端控制器:Strut1和Struts2里面的作法算是比较经典的两种前端控制器。因为 JAVA EE中对处理用户请求的单元进行了从新定义,类型更丰富,好比Filter和Servlet。而配置的映射机制使接收用户请求的粒度变得颇有弹性。 struts1里面使用Servlet做为前端控制器,来实现用户请求的封装,控制分发,和结果返回处理。struts2 对struts1这方面最大的改进莫过于使用Filter来做为前端控制器。因为Filter自己就是很是典型的Chain模式,请求运转与Filter 之中,就是行走于一个链中,并且filter接收和处理请求位于比Servlet更靠前的位置,这使咱们在基于它进行开发时,活动余地更大,更加强了咱们 对request和response的控制,也提供了一种框架内更便捷的拦截器(或者叫子链)实现方式。关于Struts1和struts2,想必你们都 已经烂熟于心了,也不必重复了。

3. 使人眼前一亮的奇妙想法:和同事交流前端控制器模式的心得,他说了一个让人神清气爽的例子,也是php的。他维 护的那个项目有一个要求比较安全的模块。刚开始他始终找不到驱动这个模块的核心在哪里。用户请求的地址老是找不到相匹配的php文件,也没有找到代码里有 能处理这些请求分发的地方。找来找去,忽然发现这个系统的前端控制器是一个你们每天都会见的页面:HTTP 404错误页面。 由于每个找不到对应资源的请求都会来到这里,因此他们在这里作了请求解析、控制分发的处理。看到如此巧妙的东西,实在是惊叹设计人员的脑子。且不说这种 作法的好与坏,它至少将核心处理的代码隐藏到了一个应用级别之外的地方。你们大笑之后,想一想这也是个很好的trick啊。php