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 相关文章推荐
一个ORACLE分页程序,挺实用的.
Oct 09 PHP
在php MYSQL中插入当前时间
Apr 06 PHP
PHP5中使用PDO连接数据库的方法
Aug 01 PHP
PHPnow安装服务[apache_pn]失败的问题的解决方法
Sep 10 PHP
教你如何开启shopnc b2b2c 伪静态
Oct 21 PHP
PHP判断浏览器、判断语言代码分享
Mar 05 PHP
php编写的一个E-mail验证类
Mar 25 PHP
PHP时间类完整实例(非常实用)
Dec 25 PHP
PHP微信开发之根据用户回复关键词\位置返回附近信息
Jun 24 PHP
PHP 记录访客的浏览信息方法
Jan 29 PHP
PHP实现可精确验证身份证号码的工具类示例
May 31 PHP
php常用的工具开发整理
Sep 26 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中10个不常见却非常有用的函数
2010/03/21 PHP
php和javascript之间变量的传递实现代码
2012/12/19 PHP
ThinkPHP空模块和空操作详解
2014/06/30 PHP
PHP实现基于栈的后缀表达式求值功能
2017/11/10 PHP
PHP使用mysqli同时执行多条sql查询语句的实例
2019/03/22 PHP
详解PHP神奇又有用的Trait
2019/03/25 PHP
Jquery跨域获得Json时invalid label错误的解决办法
2011/01/11 Javascript
得到jQuery detach()后节点中的某个值实现代码
2013/02/05 Javascript
JavaScript中用sort()方法对数组元素进行排序的操作
2015/06/09 Javascript
js 实现数值的千分位及保存小数方法(推荐)
2016/08/01 Javascript
AngularJS实现使用路由切换视图的方法
2017/01/24 Javascript
Vue父子组件双向绑定传值的实现方法
2018/07/31 Javascript
vue侧边栏动态生成下级菜单的方法
2018/09/07 Javascript
微信小程序实现带参数的分享功能(两种方法)
2019/05/17 Javascript
layui时间控件选择时间范围的实现方法
2019/09/28 Javascript
Vue filter 过滤当前时间 实现实时更新效果
2019/12/20 Javascript
在 Vue 中编写 SVG 图标组件的方法
2020/02/24 Javascript
JavaScript前端实现压缩图片功能
2020/03/06 Javascript
Python中在for循环中嵌套使用if和else语句的技巧
2016/06/20 Python
对python中for、if、while的区别与比较方法
2018/06/25 Python
基于python实现学生管理系统
2018/10/17 Python
python实现合并两个排序的链表
2019/03/03 Python
关于Python3 类方法、静态方法新解
2019/08/30 Python
python实现监控阿里云账户余额功能
2019/12/16 Python
python和php学习哪个更有发展
2020/06/17 Python
pytorch加载自己的图像数据集实例
2020/07/07 Python
Python爬虫入门教程01之爬取豆瓣Top电影
2021/01/24 Python
中学劳技课教师的自我评价
2014/02/05 职场文书
趣味运动会策划方案
2014/06/02 职场文书
2015年幼儿园师德师风建设工作总结
2015/10/23 职场文书
三好学生主要事迹怎么写
2015/11/03 职场文书
HR在给员工开具离职证明时,需要注意哪些问题?
2019/07/03 职场文书
详解CocosCreator消息分发机制
2021/04/16 Javascript
晶体管来复再生式二管收音机
2021/04/22 无线电
Python Django搭建文件下载服务器的实现
2021/05/10 Python
div与span之间的区别与使用介绍
2021/12/06 HTML / CSS