您的位置:首页 > 编程语言 > PHP开发

PHP中MVC框架的实现

2015-09-19 18:25 615 查看
一、目录的创建

在当前项目中创建

core:核心目录

App:网站目录

{

public:页面公共目录

controllers:控制器目录

views:存放静态页面

models:模块目录

}

index.php:项目前台入口文件

二、URL重写之隐藏index.php

项目中新建.htaccess文件

<span style="white-space:pre">		RewriteEngine on
 
RewriteCond %{REQUEST_FINENAME} !-f
RewriteCond %{REQUEST_FINENAME} !-d

RewriteRule  ^(.*)$ index.php?url=$1 [QSA,L]</span>


在httpd.conf文件中去掉LoadModule rewrite_module modules/mod_rewrite.so前的#号

可直接打印 $_GET['url'] 查看url

三、自动加载类文件

core中创建App.class.php

<span style="white-space:pre">		</span>public static function MyAutoloader($className)
{
//控制器所在的目录
$controller='app/controllers/' . $className .'.class.php';

//模型所在的目录
$model='app/models/' . $className .'.class.php';

//项目的核心目录
$core='core/' .  $className .'.class.php';

//判断文件在那个目录中
if(file_exists($controller))
{
require_once($controller);
}else if(file_exists($model))
{
require_once($model);
}else if(file_exists($core))
{
require_once($core);
}else
{
throw new Exception('类文件不存在');
}
}


在inde.php文件中

<span style="white-space:pre">	</span>require_once  "./core/App.class.php";

//注册一个用户自定义的自动加载类方法
spl_autoload_register(array('App','MyAutoloader'));


三、解析URL——解析参数

在core目录App.class.php文件中

<span style="white-space:pre">	</span>/***
/*URL地址解析
*/
protected static function parseUrl()
{
if(!isset($_GET['url']))
{
die("无url");
}
$url=explode('/' ,$_GET['url']);

if(isset($url[0]) && strlen($url[0])>0)
{
self::$controller=$url[0];

if(isset($url[1]) && strlen($url[1])>0)
{
self::$method=$url[1];

unset($url[0]);
unset($url[1]);
}
if(isset($url))
{
self::$pams=array_values($url);
}
}
}

/**
/*项目入口
*/
public static function run()
{
self::parseUrl();

$con_dir='app/controllers/' . self::$controller .".class.php";
if(file_exists($con_dir))
{
$c=new self::$controller;
<span style="white-space:pre">	</span>}
else
{
throw new Exception("控制器不存在");
}
if(method_exists($c,self::$method))
{
$m=self::$method;
//判断是否参数传递
$new_pam=array();   //用于存储处理好的参数,参数名为做为数组下标 参数的值作为数组的元素值 array
$num=count(self::$pams);
if($num > 0)
{
if($num==1)
{
//判断参数是否为数值
if(is_numeric(self::$pams[0]))
{
$new_pam['id']=self::$pams[0];
}
else
{
throw new Exception("参数异常");
}

}else if($num>1){
//判断参数的名称和值是否是2的倍数
if($num % 2 ==0)
{
for($i=0;$i<$num;$i+=2)
{
$new_pam[self::$pams[$i]]=self::$pams[$i+1];
}
}
else
{
throw new Exception("参数异常");
}

}
$c->$m($new_pam);
}
else
{
$c->$m();
}
}
else
{
throw new Exception("方法不存在");
<span style="white-space:pre">	</span>}
}


四、创建控制流基类

在core目录下创建Controller.class.php

<span style="white-space:pre">	</span><?php
<span style="white-space:pre">	</span>/**
<span style="white-space:pre">	</span>*所有控制器的基类
<span style="white-space:pre">	</span>*/

<span style="white-space:pre">	</span>class Controller
<span style="white-space:pre">	</span>{
<span style="white-space:pre">	</span>//加载指定的模板页面
<span style="white-space:pre">	</span>public function show($page, $data=array())
<span style="white-space:pre">	</span>{
<span style="white-space:pre">	</span>$page_dir='app/views/' .$page . '.php';
<span style="white-space:pre">	</span>if(file_exists($page_dir))
<span style="white-space:pre">	</span>{
<span style="white-space:pre">	</span>require $page_dir;
<span style="white-space:pre">	</span>}

<span style="white-space:pre">	</span>}
<span style="white-space:pre">	</span>}

<span style="white-space:pre">	</span>?>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: