Router.class.php代码:
<?php
/*
+----------------------------------------------------------------------
+ Title : Router - 路由器基类
+ Author : 小黄牛
+ Version : V1.0.0.1
+ Initial-Time : 2016-10-17 11:12
+ Last-time : 2016-10-17 11:12 + 小黄牛
+ Desc : 这个类包含了路由重定向
+----------------------------------------------------------------------
*/
class Router{
//路由器需要以下的四个成员来初始化Index首页
static protected $controller = 'index'; //默认控制器
static protected $method = 'index'; //默认方法
static protected $url_split = '/'; //路由分隔符
static protected $url_suffix = '.html'; //URL后缀名
// 获得真实的Path_Info参数
protected static function Path_Info(){
if (isset($_SERVER['PATH_INFO'])) {
return $_SERVER['PATH_INFO'];
}
if (isset($_SERVER['REDIRECT_PATH_INFO'])) {
return $_SERVER['REDIRECT_PATH_INFO'];
}
if (isset($_SERVER['REDIRECT_URL'])) {
return $_SERVER['REDIRECT_URL'];
}
return false;
}
}
Route.class.php代码:
<?php
/*
+----------------------------------------------------------------------
+ Title : Route - 路由器子类 - 继承与控制器基类
+ Author : 小黄牛
+ Version : V1.0.0.1
+ Initial-Time : 2016-10-17 11:37
+ Last-time : 2016-10-17 11:37 + 小黄牛
+ Desc :
+----------------------------------------------------------------------
*/
class Route extends Router{
/**
* @Title : 全类型路由
* @Author : 小黄牛
* @param string : $RouAlias 路由别名,用于快速生成URL
* @param string : $RouParameter 路由参数变量名,用于识别对应的URL参数 或闭包路由
* @param string : $CA_Function 控制器方法
* @return : 返回一个实例
*/
public static function Any($RouAlias,$RouParameter='',$CA_Function='') {
# 获得路由地址
$PATH_INFO = self::Path_Info();
# 判断是否为对应的路由 - 这是错误的路由
$URL = explode('/'.$RouAlias,$PATH_INFO);
if(empty($URL[0]) == false){return false;}
/*****************************闭包路由*****************************/
# 获得闭包对象 - 或URL参数
$Parameter = $RouParameter;
# 判断路由参数是否为对象(闭包路由)
if(is_object($Parameter)){
# 是则调用对象,并返回
$Parameter();
return true;
}
/*****************************不是闭包路由*****************************/
# 删除开头路由
$path = ltrim($PATH_INFO, '/'.$RouAlias);
# 将URL分割成数组
$paths = explode(self::$url_split,$path);
# 将URL变量名分割成数组
$urls = explode(self::$url_split,$RouParameter);
# 重新赋值
foreach ($urls as $key=>$val){
$_GET[$val] = $paths[$key];
}
# 将对应的控制器跟操作方法分割成数组
$AC = explode(self::$url_split,$CA_Function);
# 自动加载控制器
$instance = new $AC[0]();
# 访问对应的操作方法
$instance->$AC[1]();
}
}
Ceshi.php代码:
<?php
/*
+----------------------------------------------------------------------
+ Title : 这是给路由器测试调用的控制器文件
+ Author : 小黄牛
+ Version : V1.0.0.1
+ Initial-Time : 2016-10-17 11:27
+ Last-time : 2016-10-17 11:27 + 小黄牛
+ Desc : 无
+----------------------------------------------------------------------
*/
//测试控制器-Index
class Index{
public function Index(){
echo '这是IndexController控制器下的Index方法<br/>由于Index-Index等于构造方法,所以会加载出两次<br/>';
}
public function Add(){
echo '这是IndexController控制器下的Add方法<br/>';
}
}
//测试控制器-Ceshi
class Ceshi{
public function Index(){
echo '这是CeshiController控制器下的Index方法<br/>';
}
public function Add(){
echo '这是CeshiController控制器下的Add方法<br/>';
}
}
//测试控制器-Test
class Test{
public function Index(){
echo $_GET['id'];
echo '这是TestController控制器下的Index方法<br/>';
}
public function Add(){
echo '这是TestController控制器下的Add方法<br/>';
}
}
index.php代码:
<?php
/*
+----------------------------------------------------------------------
+ Title : 路由器 单一入口
+ Author : 小黄牛
+ Version : V1.0.0.1
+ Initial-Time : 2016-10-17 11:24
+ Last-time : 2016-10-17 11:24 + 小黄牛
+ Desc : 从这里实现路由监听
+----------------------------------------------------------------------
*/
# 声明页面编码
header("Content-type: text/html; charset=utf-8");
# 引入路由器
require 'Router.class.php';
# 引入路由子类
require 'Route.class.php';
# 引入对应的测试路由类
require 'Ceshi.php';
# 加载路由监听
# 闭包路由
Route::Any('b/',function(){
echo '这下牛逼了';
});
# 默认路由
Route::Any('asd/',function(){
echo '11111111';
});
# 不是闭包路由
Route::Any('i/z','id/name','ceshi/Add');
Route::Any('i/x','id/name','test/index');
Route::Any('i/c','id/name','index/index');
访问的URL
index.php/asd/
index.php/b/
index.php/i/z/1/2
index.php/i/x/3/4
index.php/i/c/5/6
文章努力渲染中,请稍等片刻....