这是一篇介绍如何用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的配置方式用的)
<files test>
forcetype application/x-httpd-php
</files>
文件1:(test.php)
<?php
/*-------------------------------------
* test.php
*
* 作为你的网站的入口的文件
* 用来初始化和入口
* 调用执行controler的调用
*
-------------------------------------*/
require "application.php";
$aa = new application();
$aa->parse();
$aa->go();
?>
文件2:(goodcontroler.php)
<?php
/*-------------------------------------
* goodcontroler.php
*
* 用来控制 url=/test/good 来的访问
*
-------------------------------------*/
class goodcontroler{
/*
* 控制类的调用方法,唯一的报漏给外部的接口
*/
function control(){
echo "this is from goodcontroler url=*********/test/good";
}
}
?>
文件3:(badcontroler.php)
<?php
/*-------------------------------------
* badcontroler.php
*
* 用来控制 url=/test/bad 来的访问
*
-------------------------------------*/
class badcontroler{
/*
* 控制类的调用方法,唯一的报漏给外部的接口
*/
function control(){
echo "this is from goodcontroler url=*********/test/bad";
}
}
?>
文件4:(application.php)
<?php
/*-------------------------------------
* application.php
*
* 用来实现网站的统一入口,调用controler类
*
-------------------------------------*/
class application{
//用来记录所要进行的操作
var $action;
//controler文件的路径名
var $controlerfile;
//controler的类名
var $controlerclass;
function application(){
}
function parse(){
$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的动作
*/
function go(){
$c = new $this->controlerclass();
$c->control();
}
}
?>
新闻热点
疑难解答