用PHP开始你的MVC (一)整合你的站点入口
这是一篇介绍如何用php来实现MVC模式开发的文件。关于MVC模式的技术文章网上随处可以,所以这篇文件将不再讲述这种模式的优缺点(实际
上是我说不清楚),子讲他的php技术实现。并且在以后的系列文章中也是以讲技术为主。
一、实现统一的网站入口(在MVC中调用Controler层的方法,也就是控制层)
大家也许经常在网上看到这样的路径(http://www.aaa.com/aaa/bbb/aaa?id=5),让人不解,这样的网站的实现方式有几种可能性:
1、隐藏文件的扩展名,对这种做法的好处,众说纷纭,不过个人觉得没有必要;
2、用了网站的重定向规则,实现虚拟路径;
3、强制文件解析的方式,实现虚拟路径。
用第2/3种方法可以实现网站的统一接口,合理的整合网站,更好的体现网站的安全性和架构,用这两种方式的网站大多是使用“MVC”模式构
建和实现的。
下面是一个例子
访问路径如下:
....../test/*******/Bad ....../test/*******/Good (其中的"******"可以用任何字符串替换,"......."是你的web路径) |
文件的目录结构如下
|--.htaccess |--test |--Application.php |--Controler/GoodControler.php |--Controler/BadControler.php 注意文件".htaccess",在windows下不能直接建立的,可以在命令行模式下建立. |
文件0:(.htaccess)(这个文件是更改apache的配置方式用的)
<filestest> forcetypeapplication/x-httpd-php </files> |
文件1:(test.php)
<?php /*------------------------------------- *test.php * *作为你的网站的入口的文件 *用来初始化和入口 *调用执行Controler的调用 * -------------------------------------*/ require"Application.php"; $aa=newApplication(); $aa->parse(); $aa->go(); ?> |
文件2:(GoodControler.php)
<?php /*------------------------------------- *GoodControler.php * *用来控制url=/test/Good来的访问 * -------------------------------------*/ classGoodControler{ /* *控制类的调用方法,唯一的报漏给外部的接口 */ functioncontrol(){ echo"thisisfromGoodControlerurl=*********/test/Good"; } } ?> |
文件3:(BadControler.php)
<?php /*------------------------------------- *BadControler.php * *用来控制url=/test/Bad来的访问 * -------------------------------------*/ classBadControler{ /* *控制类的调用方法,唯一的报漏给外部的接口 */ functioncontrol(){ echo"thisisfromGoodControlerurl=*********/test/Bad"; } } ?> |
文件4:(Application.php)
<?php /*------------------------------------- *Application.php * *用来实现网站的统一入口,调用Controler类 * -------------------------------------*/ classApplication{ //用来记录所要进行的操作 var$action; //controler文件的路径名 var$controlerFile; //controler的类名 var$controlerClass; functionApplication(){ } functionparse(){ $this->_parsePath(); $this->_getControlerFile(); $this->_getControlerClassname(); } /* *解析当前的访问路径,得到要进行动作 */ function_parsePath(){ list($path,$param)=explode("?",$_SERVER["REQUEST_URI"]); $pos=strrpos($path,"/"); $this->action=substr($path,$pos+1); } /* *通过动作$action,解析得到该$action要用到的controler文件的路径 */ function_getControlerFile(){ $this->controlerFile="./Controler/".$this->action."Controler.php"; if(!file_exists($this->controlerFile)) die("Controler文件名(".$this->controlerFile.")解析错误"); require_once$this->controlerFile; } /* *通过动作$action,解析得到该$action要用到的controler类名 */ function_getControlerClassname(){ $this->controlerClass=$this->action."Controler"; if(!class_exists($this->controlerClass)) die("Controler类名(".$this->controlerClass.")解析错误"); } /* *调用controler,执行controler的动作 */ functiongo(){ $c=new$this->controlerClass(); $c->control(); } } ?> |