PHP实现路由映射到指定控制器


Posted in PHP onAugust 13, 2016

自定义路由的功能,指定到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实现路由映射到指定控制器

PHP实现路由映射到指定控制器

PHP实现路由映射到指定控制器

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
mysql 中InnoDB和MyISAM的区别分析小结
Apr 15 PHP
php结合ajax实现赞、顶、踩功能实例
May 12 PHP
php中cookie实现二级域名可访问操作的方法
Nov 11 PHP
php简单操作mysql数据库的类
Apr 16 PHP
android上传图片到PHP的过程详解
Aug 03 PHP
PHP实现删除字符串中任何字符的函数
Aug 11 PHP
php上传图片类及用法示例
May 11 PHP
PHP基于自增数据如何生成不重复的随机数示例
May 19 PHP
PHP实现创建微信自定义菜单的方法示例
Jul 14 PHP
PHP数组内存利用率低和弱类型详细解读
Aug 10 PHP
PHP文件管理之实现网盘及压缩包的功能操作
Sep 20 PHP
多个Laravel项目如何共用migrations详解
Sep 25 PHP
Yii2.0中的COOKIE和SESSION用法
Aug 12 #PHP
PHP Oauth授权和本地加密实现方法
Aug 12 #PHP
PHP 读取大文件并显示的简单实例(推荐)
Aug 12 #PHP
PHPWind9.0手动屏蔽验证码解决后台关闭验证码但是依然显示的问题
Aug 12 #PHP
PHP请求Socket接口测试实例
Aug 12 #PHP
php+jquery+html实现点击不刷新加载更多的实例代码
Aug 12 #PHP
php网页版聊天软件实现代码
Aug 12 #PHP
You might like
全国FM电台频率大全 - 14 江西省
2020/03/11 无线电
discuz Passport 通行证 整合笔记
2008/06/30 PHP
php实现mysql数据库操作类分享
2014/02/14 PHP
删除PHP数组中的重复元素的实现代码
2017/04/10 PHP
PHP弱类型语言中类型判断操作实例详解
2017/08/10 PHP
Extjs学习笔记之九 数据模型(上)
2010/01/11 Javascript
ExpressJS入门实例
2015/01/14 Javascript
使用impress.js制作幻灯片
2015/09/09 Javascript
WordPress中鼠标悬停显示和隐藏评论及引用按钮的实现
2016/01/12 Javascript
原生JS实现拖拽图片效果
2020/08/27 Javascript
jquery zTree异步加载、模糊搜索简单实例分享
2016/03/24 Javascript
JS实现图片局部放大或缩小的方法
2016/08/20 Javascript
js实现StringBuffer的简单实例
2016/09/02 Javascript
JS实现简单易用的手机端浮动窗口显示效果
2016/09/07 Javascript
浅谈Node框架接入ELK实践总结
2019/02/22 Javascript
vue-router 前端路由之路由传值的方式详解
2019/04/30 Javascript
js实现微信聊天效果
2020/08/09 Javascript
Element el-button 按钮组件的使用详解
2021/02/01 Javascript
[05:06]2017亚洲邀请赛DAC回顾片
2017/04/19 DOTA
rhythmbox中文名乱码问题解决方法
2008/09/06 Python
paramiko模块安装和使用(远程登录服务器)
2014/01/27 Python
Python多进程分块读取超大文件的方法
2016/04/13 Python
python实现共轭梯度法
2019/07/03 Python
安装docker-compose的两种最简方法
2019/07/30 Python
使用 pytorch 创建神经网络拟合sin函数的实现
2020/02/24 Python
Python sorted排序方法如何实现
2020/03/31 Python
高三上学期学习自我评价
2014/04/23 职场文书
打架检讨书
2015/01/27 职场文书
长城英文导游词
2015/01/30 职场文书
致创业的您:这类人不适合餐饮创业
2019/08/19 职场文书
2019年手机市场的调研报告2篇
2019/10/10 职场文书
HTML中的表单Form实现居中效果
2021/05/25 HTML / CSS
如何自己动手写SQL执行引擎
2021/06/02 MySQL
javascript对象3个属性特征
2021/11/17 Javascript
十大经典日本动漫排行榜 海贼王第三,犬夜叉仅第八
2022/03/18 日漫
Nginx 配置 HTTPS的详细过程
2022/05/30 Servers