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 相关文章推荐
phpmyadmin导入(import)文件限制的解决办法
Dec 11 PHP
vs中通过剪切板循环来循环粘贴不同内容
Apr 30 PHP
DOM XPATH获取img src值的query
Sep 23 PHP
php绘图中显示不出图片的原因及解决
Mar 05 PHP
Yii实现多按钮保存与提交的方法
Dec 03 PHP
php单例模式实现方法分析
Mar 14 PHP
php自定义hash函数实例
May 05 PHP
PHP调用Mailgun发送邮件的方法
May 04 PHP
PHP设计模式之装饰器模式实例详解
Feb 07 PHP
如何让PHP编码更加好看利于阅读
May 12 PHP
laravel框架如何设置公共头和公共尾
Oct 22 PHP
WordPress伪静态规则设置代码实例
Dec 10 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
用php写的serv-u的web申请账号的程序
2006/10/09 PHP
探讨GDFONTPATH能否被winxp下的php支持
2013/06/21 PHP
PHP中类属性与类静态变量的访问方法示例
2016/07/13 PHP
PHP中include()与require()的区别说明
2017/02/14 PHP
PHP随机获取未被微信屏蔽的域名(微信域名检测)
2017/03/19 PHP
JavaScript 字符串乘法
2009/08/20 Javascript
小试JQuery的AutoComplete插件
2011/05/04 Javascript
JS去除右边逗号的简单方法
2013/07/03 Javascript
js获取php变量的实现代码
2013/08/10 Javascript
关于删除时的提示处理(确定删除吗)
2013/11/03 Javascript
JS验证邮箱格式是否正确的代码
2013/12/05 Javascript
仿百度联盟对联广告实现代码
2014/08/30 Javascript
node+express+jade制作简单网站指南
2014/11/26 Javascript
jquery trigger实现联动的方法
2016/02/29 Javascript
详细总结Javascript中的焦点管理
2016/09/17 Javascript
js鼠标跟随运动效果
2017/03/11 Javascript
利用JS做网页特效_大图轮播(实例讲解)
2017/08/09 Javascript
Vue.js项目模板搭建图文教程
2017/09/20 Javascript
原生js实现淘宝放大镜效果
2020/10/28 Javascript
快速搭建Node.js(Express)用户注册、登录以及授权的方法
2019/05/09 Javascript
webpack 代码分离优化快速指北
2019/05/18 Javascript
python获取一组数据里最大值max函数用法实例
2015/05/26 Python
python实现识别相似图片小结
2016/02/22 Python
django-初始配置(纯手写)详解
2019/07/30 Python
用OpenCV将视频分解成单帧图片,图片合成视频示例
2019/12/10 Python
python随机生成大小写字母数字混合密码(仅20行代码)
2020/02/01 Python
python 模拟登陆github的示例
2020/12/04 Python
纽约服装和生活方式品牌:Saturdays NYC
2017/08/13 全球购物
Clarks鞋澳大利亚官方网站:Clarks Australia
2019/12/25 全球购物
欧姆龙医疗保健与医疗产品:Omron Healthcare
2020/02/10 全球购物
学员自我鉴定
2014/03/19 职场文书
2014年大学生预备党员思想汇报1000字
2014/09/13 职场文书
阿甘正传观后感
2015/06/01 职场文书
勇敢的心观后感
2015/06/09 职场文书
2016年党员干部公开承诺书
2016/03/24 职场文书
WordPress多语言翻译插件 - WPML使用教程
2021/04/01 PHP