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 相关文章推荐
动易数据转成dedecms的php程序
Apr 07 PHP
php对gzip文件或者字符串解压实例参考
Jul 25 PHP
又一个php 分页类实现代码
Dec 03 PHP
PHP中几个常用的魔术常量
Feb 23 PHP
PHP正则表达式替换站点关键字链接后空白的解决方法
Sep 16 PHP
如何使用Gitblog和Markdown建自己的博客
Jul 31 PHP
PHP程序员的技术成长规划
Mar 25 PHP
PHP购物车类Cart.class.php定义与用法示例
Jul 20 PHP
PHP基于Closure类创建匿名函数的方法详解
Aug 17 PHP
php使用lua+redis实现限流,计数器模式,令牌桶模式
Apr 04 PHP
laravel框架使用FormRequest进行表单验证,验证异常返回JSON操作示例
Feb 18 PHP
phpQuery采集网页实现代码实例
Apr 02 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
php4的彩蛋
2006/10/09 PHP
Windows下XDebug 手工配置与使用说明
2010/07/11 PHP
destoon在各个服务器下设置URL Rewrite(伪静态)的方法
2014/06/21 Servers
php删除左端与右端空格的方法
2014/11/29 PHP
php使用preg_match()函数验证ip地址的方法
2017/01/07 PHP
PHP设计模式之模板模式定义与用法详解
2018/12/20 PHP
Jquery工作常用实例 使用AJAX使网页进行异步更新
2011/07/26 Javascript
点击隐藏页面左栏或右栏实现js代码
2013/04/01 Javascript
jquery的attr方法禁用表单元素禁用输入内容
2014/06/23 Javascript
js中iframe调用父页面的方法
2014/10/30 Javascript
JavaScript中关联原型链属性特性
2016/02/13 Javascript
Extjs4.0 ComboBox如何实现三级联动
2016/05/11 Javascript
js判断传入时间和当前时间大小实例(超简单)
2018/01/11 Javascript
jQuery+css last-child实现选择最后一个子元素操作示例
2018/12/10 jQuery
读取本地json文件,解析json(实例讲解)
2017/12/06 Python
Python从使用线程到使用async/await的深入讲解
2018/09/16 Python
完美解决Python matplotlib绘图时汉字显示不正常的问题
2019/01/29 Python
Python在OpenCV里实现极坐标变换功能
2019/09/02 Python
Python BeautifulReport可视化报告代码实例
2020/04/13 Python
tensorflow基于CNN实战mnist手写识别(小白必看)
2020/07/20 Python
用Python制作音乐海报
2021/01/26 Python
HTML5 本地存储实现购物车功能
2017/09/07 HTML / CSS
Turnbull & Asser官网:英国皇室御用的顶级定制衬衫
2019/01/31 全球购物
清华大学自主招生自荐信
2014/01/29 职场文书
房地产开盘策划方案
2014/02/10 职场文书
演讲稿的格式及范文
2014/08/22 职场文书
元旦标语大全
2014/10/09 职场文书
会计求职自荐信
2015/03/26 职场文书
假如给我三天光明读书笔记
2015/06/26 职场文书
小学数学教师研修感悟
2015/11/18 职场文书
CSS3点击按钮圆形进度打钩效果的实现代码
2021/03/30 HTML / CSS
Nginx的基本概念和原理
2022/03/21 Servers
简单聊一聊SQL注入及防止SQL注入
2022/03/23 MySQL
利用Python将list列表写入文件并读取的方法汇总
2022/03/25 Python
Nginx 安装SSL证书完成HTTPS部署
2022/04/28 Servers
Java实现扫雷游戏详细代码讲解
2022/05/25 Java/Android