自定义路由的功能,指定到pathinfo的url上,再次升级之前的脚本

SimpleLoader.php

<?php
class SimpleLoader{
public static function run($rules=array()){
header("content-type:text/html;charset=utf-8");
self::register();
self::commandLine();
self::router($rules);
self::pathInfo();
}
//自动加载
public static function loadClass($class){
$class=str_replace('\\', '/', $class);
$dir=str_replace('\\', '/', __DIR__);
$class=$dir."/".$class.".php";
if(!file_exists($class)){
header("HTTP/1.1 404 Not Found");
}
require_once $class;
}
//命令行模式
public static function commandLine(){
if(php_sapi_name()=="cli"){
$_SERVER['PATH_INFO']="";
foreach ($_SERVER['argv'] as $k=>$v) {
if($k==0) continue;
$_SERVER['PATH_INFO'].="/".$v;
}
}
}
//路由模式
public static function router($rules){
if(isset($_SERVER['PATH_INFO']) && !empty($rules)){
$pathInfo=ltrim($_SERVER['PATH_INFO'],"/");
foreach ($rules as $k=>$v) {
$reg="/".$k."/i";
if(preg_match($reg,$pathInfo)){
$res=preg_replace($reg,$v,$pathInfo);
$_SERVER['PATH_INFO']='/'.$res;
}
}
}
}
//pathinfo处理
public static function pathInfo(){
if(isset($_SERVER['PATH_INFO'])){
$pathinfo=array_filter(explode("/", $_SERVER['PATH_INFO']));
for($i=1;$i<=count($pathinfo);$i++){
$key=isset($pathinfo[$i]) ? $pathinfo[$i] : '';
$value=isset($pathinfo[$i+1]) ? $pathinfo[$i+1] :"";
switch ($i) {
case 1:
$_GET['m']=ucfirst($key);
break;
case 2:
$_GET['c']=ucfirst($key);
break;
case 3:
$_GET['a']=$key;
break;
default:
if($i>3){
if($i%2==0){
$_GET[$key]=$value;
}
}
break;
}
}
}
$_GET['m']=!empty($_GET['m']) ? ucfirst($_GET['m']) : 'Index';
$_GET['c']=!empty($_GET['c']) ? ucfirst($_GET['c']) : 'Index';
$_GET['a']=!empty($_GET['a']) ? $_GET['a'] : 'index';
$class="\\Controller\\{$_GET['m']}\\{$_GET['c']}";
$controller=new $class;
if(method_exists($controller, $_GET['a'])){
$controller=new $class;
$controller->$_GET['a']();
}else{
header("HTTP/1.1 404 Not Found");
echo "404";
}
}
//致命错误回调
public static function shutdownCallback(){
$e=error_get_last();
if(!$e) return;
self::myErrorHandler($e['type'],'<font color="red">Fatal Error</font> '.$e['message'],$e['file'],$e['line']);
}
//错误处理
protected static function myErrorHandler($errno,$errstr,$errfile,$errline){
list($micseconds,$seconds)=explode(" ",microtime());
$micseconds=round($micseconds*1000);
$micseconds=strlen($micseconds)==1 ? '0'.$micseconds : $micseconds;
if(php_sapi_name()=="cli"){
$break="\r\n";
}else{
$break="<br/>";
}
$mes="[".date("Y-m-d H:i:s",$seconds).":{$micseconds}] ".$errfile." ".$errline." line ".$errstr.$break;
echo $mes;
}
//注册
public static function register(){
error_reporting(0);
set_error_handler(function($errno,$errstr,$errfile,$errline){
self::myErrorHandler($errno,$errstr,$errfile,$errline);
});
register_shutdown_function(function(){
self::shutdownCallback();
});
spl_autoload_register("self::loadClass");
}
}

如何使用

index.php

<?php
//路由映射
$rules=array(
'^user$'=>'User/User/getUserList',
'^user\/(\d+)$'=>'User/User/getUserById/id/$1',
'^user\/(\d+)\/article$'=>'User/User/getUserArticle/uid/$1'
);
require_once "SimpleLoader.php";
SimpleLoader::run($rules);

控制器啥样

\Controller\User\User.php

<?php
namespace Controller\User; class User{
public function getUserById(){
echo "用户信息id {$_GET['id']} 的信息";
}
public function getUserList(){
echo "用户列表";
}
public function getUserArticle(){
echo "用户id {$_GET['uid']} 的文章列表";
}
}

效果呢:

[PHP] 实现路由映射到指定控制器的更多相关文章

  1. 第三百零四节,Django框架,urls.py模块,views.py模块,路由映射与路由分发以及逻辑处理——url控制器

    Django框架,urls.py模块,views.py模块,路由映射与路由分发以及逻辑处理——url控制器 这一节主讲url控制器 一.urls.py模块 这个模块是配置路由映射的模块,当用户访问一个 ...

  2. 二 Django框架,urls.py模块,views.py模块,路由映射与路由分发以及逻辑处理——url控制器

    Django框架,urls.py模块,views.py模块,路由映射与路由分发以及逻辑处理——url控制器 这一节主讲url控制器 一.urls.py模块 这个模块是配置路由映射的模块,当用户访问一个 ...

  3. [Buffalo]ASP.NET MVC路由映射

    Asp.Net的路由系统旨在通过注册URl模版与物理文件之间的映射进而实现请求地址与文件路径之间的分离,但对于Asp.Net Mvc应用来说,请求的目标却是定义在某个Controller类型中的Act ...

  4. ASP.NET的路由系统:路由映射

    总的来说,我们可以通过RouteTable的静态属性Routes得到一个基于应用的全局路由表,通过上面的介绍我们知道这是一个类型的RouteCollection的集合对象,我们可以通过调用它的MapP ...

  5. Django-url路由映射与views逻辑处理

    一.URL路由映射 路由映射模块,主要完成url与views视图函数的映射.当一个url请求到来时,会按照这个模块中的url地址从上到下进行匹配,如果匹配成功,将执行映射试图中的函数:反之将返回404 ...

  6. 第二百六十八节,Tornado框架-路由映射之二级域名支持,html模板继承以及导入

    Tornado框架-路由映射之二级域名支持,html模板继承以及导入 二级域名路由映射add_handlers()设置二级域名路由映射 注意:二级域名需要结合服务器ip绑定域名 框架引擎 #!/usr ...

  7. 第二百六十四节,Tornado框架-基于正则的动态路由映射分页数据获取计算

    Tornado框架-基于正则的动态路由映射分页数据获取计算 分页基本显示数据 第一步.设置正则路由映射配置,(r"/index/(?P<page>\d*)", inde ...

  8. 第二百五十七节,Tornado框架-路由映射,逻辑处理,文件归类配置

    Tornado框架-路由映射,逻辑处理,文件归类配置 Tornado框架 Tornado 是 FriendFeed 使用的可扩展的非阻塞式 web 服务器及其相关工具的开源版本.这个 Web 框架看起 ...

  9. Asp.net MVC 基于Area的路由映射

    对于一个较大规模的Web应用,我们可以从功能上通过Area将其划分为较小的单元.每个Area相当于一个独立的子系统,具有一套包含Models.Views和Controller在内的目录结构和配置文件. ...

随机推荐

  1. [LeetCode] Sparse Matrix Multiplication

    Problem Description: Given two sparse matrices A and B, return the result of AB. You may assume that ...

  2. VPN各种常见状态码及修复方法

    1.633错误 :由于Windows系统本身的问题,在PPTP协议连接多次并断开之后,后导致一直出现633错误.参见微软的官方解决方案:http://support.microsoft.com/kb/ ...

  3. 对象与Byte数组相互转化工具方法

    /** * 对象转byte * @param obj * @return */ private byte[] ObjectToByte(Object obj) { byte[] bytes = nul ...

  4. 打包并压缩seajs代码

    背景 seajs是一款优秀的模块开发插件,但是当我们使用它来进行模块化开发的时候,由于它的每个模块的加载都会进行一次http请求,那么当模块数量倍增的时候,会拖慢页面的加载速度. 通常我们为了能加快页 ...

  5. JS文件放在头还是尾

    目前绝大部分的浏览器都是采取阻塞方式(Scripts Block Downloads)加载Javascript文件的:javascript在头部会阻止其他元素并行加载(css,图片,网页):这种机制的 ...

  6. 破解android手机图形锁

    安卓手机的图形锁包括3*3,4*4,5*5的点阵,按次序连接数个点从而达到锁定/解锁的功能.以3*3为例,最少需要连接4个点,最多能连接9个点.在我们进行绘制图形的过程中,每选中这9个点中的一个点,实 ...

  7. VS-Visual Studio-IIS Express 支持局域网访问

    本文转自:http://www.itnose.net/detail/6132793.html 使用Visual Studio开发Web网页的时候有这样的情况:想要在调试模式下让局域网的其他设备进行访问 ...

  8. The connection to adb is down, and a severe error has occured.(DDMS中没有真机)

    最近老是出现真机用着用着就掉线了,在DDMS中看不到,运行项目出现选择运行机器中也没有,360助手连接电脑OK,任务管理器中没有adb.exe,重启eclipse不行,只能每次重启电脑.按照http: ...

  9. 使用TFS+GIT实现分布式项目管理

    前言 GIT是近来很流行的一种版本控制系统,是Linux内核之父Linus Torvalds为了管理Linux内核的开发而开发的一种开源的版本控制工具. GIT相比传统的版本控制工具最大的优点是实现了 ...

  10. 链表中倒数第k个结点

    题目: 输入一个链表,输出该链表中倒数第k个结点. 思路: 因为是单向链表,如果使用最普通的遍历来解决的话会多出很多不必要的遍历.有一个比较好的解法,设置两个指针两个指针之间差k-1个位置,也就是当后 ...