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 相关文章推荐
php中的时间显示
Jan 18 PHP
asp和php下textarea提交大量数据发生丢失的解决方法
Jan 20 PHP
PHP面向接口编程 耦合设计模式 简单范例
Mar 23 PHP
php全局变量和类配合使用深刻理解
Jun 05 PHP
PHP学习笔记之字符串编码的转换和判断
May 22 PHP
php+memcache实现的网站在线人数统计代码
Jul 04 PHP
字符串长度函数strlen和mb_strlen的区别示例介绍
Sep 09 PHP
php计算两个日期相差天数的方法
Mar 14 PHP
JS+PHP实现用户输入数字后显示最大的值及所在位置
Jun 19 PHP
小程序微信支付功能配置方法示例详解【基于thinkPHP】
May 05 PHP
PHP实现chrome表单请求数据转换为接口使用的json数据
Mar 04 PHP
open_basedir restriction in effect. 原因与解决方法
Mar 14 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中实现记住密码自动登录的代码
2011/03/02 PHP
基于empty函数的判断详解
2013/06/17 PHP
destoon实现资讯信息前面调用它所属分类的方法
2014/07/15 PHP
详解laravel passport OAuth2.0的4种模式
2019/11/04 PHP
JavaScript判断DOM何时加载完毕的技巧
2012/11/11 Javascript
使用js 设置url参数
2013/07/08 Javascript
js验证输入是否为手机号码或电话号码示例
2013/12/30 Javascript
调用DOM对象的focus使文本框获得焦点
2014/02/19 Javascript
基于javascript实现简单计算器功能
2016/01/03 Javascript
使用node+vue.js实现SPA应用
2016/01/28 Javascript
javascript计时器编写过程与实现方法
2016/02/29 Javascript
Vue.js动态添加、删除选题的实例代码
2016/09/30 Javascript
Webpack+Vue如何导入Jquery和Jquery的第三方插件
2017/02/20 Javascript
微信小程序实现折叠面板
2018/01/31 Javascript
浅谈在不使用ssr的情况下解决Vue单页面SEO问题(2)
2018/11/08 Javascript
zepto.js 实时监听输入框的方法
2018/12/04 Javascript
jquery图片预览插件实现方法详解
2019/07/18 jQuery
Webpack中loader打包各种文件的方法实例
2019/09/03 Javascript
解决layer.open后laydate失效的问题
2019/09/06 Javascript
es6函数中的作用域实例分析
2020/04/18 Javascript
Vuejs通过拖动改变元素宽度实现自适应
2020/09/02 Javascript
[01:17:12]职来职往完美电竞专场
2014/09/18 DOTA
python如何为被装饰的函数保留元数据
2018/03/21 Python
对python中array.sum(axis=?)的用法介绍
2018/06/28 Python
对Python中的条件判断、循环以及循环的终止方法详解
2019/02/08 Python
Python MongoDB 插入数据时已存在则不执行,不存在则插入的解决方法
2019/09/24 Python
Python经典五人分鱼实例讲解
2021/01/04 Python
基于MUI框架使用HTML5实现的二维码扫描功能
2018/03/01 HTML / CSS
出纳岗位职责
2013/11/09 职场文书
班会关于环保演讲稿
2013/12/29 职场文书
2014年城市管理工作总结
2014/12/02 职场文书
离职信范文
2015/06/23 职场文书
毕业赠语大全
2015/06/23 职场文书
2016年教师节感言
2015/12/09 职场文书
MySql学习笔记之事务隔离级别详解
2021/05/12 MySQL
DjangoRestFramework 使用 simpleJWT 登陆认证完整记录
2021/06/22 Python