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数据缓存技术
Feb 14 PHP
一篇入门的php Class 文章
Apr 04 PHP
如何使用PHP计算上一个月的今天
May 23 PHP
PHP Global变量定义当前页面的全局变量实现探讨
Jun 05 PHP
关于初学PHP时的知识积累总结
Jun 07 PHP
Mac系统下使用brew搭建PHP(LNMP/LAMP)开发环境
Mar 03 PHP
php带抄送和密件抄送的邮件发送方法
Mar 20 PHP
PHP内核探索之解释器的执行过程
Dec 22 PHP
Laravel中的Blade模板引擎示例详解
Oct 10 PHP
Laravel Intervention/image图片处理扩展包的安装、使用与可能遇到的坑详解
Nov 14 PHP
Smarty模板配置实例简析
Jul 20 PHP
is_file和file_exists效率比较
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中截取字符串支持utf-8
2007/01/18 PHP
php自动获取字符串编码函数mb_detect_encoding
2011/05/31 PHP
Javascript面向对象编程(二) 构造函数的继承
2011/08/28 Javascript
jQuery实现的淡入淡出二级菜单效果代码
2015/09/15 Javascript
js获取Get值的方法
2016/09/29 Javascript
AngularJS读取JSON及XML文件的方法示例
2017/05/25 Javascript
详解Vue整合axios的实例代码
2017/06/21 Javascript
详解A标签中href=&quot;&quot;的几种用法
2017/08/20 Javascript
提升页面加载速度的插件InstantClick
2017/09/12 Javascript
vue生成随机验证码的示例代码
2017/09/29 Javascript
详解Angular如何正确的操作DOM
2018/07/06 Javascript
详解JavaScript中的函数、对象
2019/04/01 Javascript
layui点击左侧导航栏,实现不刷新整个页面,只刷新局部的方法
2019/09/25 Javascript
layui实现多图片上传并限制上传的图片数量
2019/09/26 Javascript
使用JavaScript计算前一天和后一天的思路详解
2019/12/20 Javascript
JS数组方法push()、pop()用法实例分析
2020/01/18 Javascript
[42:27]DOTA2上海特级锦标赛主赛事日 - 3 败者组第三轮#2Fnatic VS OG第三局
2016/03/05 DOTA
[01:04:14]OG vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
用Python实现一个简单的能够发送带附件的邮件程序的教程
2015/04/08 Python
pandas.dataframe按行索引表达式选取方法
2018/10/30 Python
Python玩转Excel的读写改实例
2019/02/22 Python
用Python写一个自动木马程序
2019/09/17 Python
tensorflow 实现自定义梯度反向传播代码
2020/02/10 Python
基于Python制作一副扑克牌过程详解
2020/10/19 Python
柯基袜:Corgi Socks
2017/01/26 全球购物
Charlotte Tilbury英国官网:英国彩妆品牌
2017/05/26 全球购物
联想韩国官网:Lenovo Korea
2018/05/10 全球购物
致接力运动员广播稿
2014/02/17 职场文书
2015年党建工作目标责任书
2015/05/08 职场文书
2016应届毕业生实习心得体会
2015/10/09 职场文书
涨工资申请书应该怎么写?
2019/07/08 职场文书
六年级上册《闻官军收河南河北》的教学设计
2019/11/15 职场文书
css position fixed 左右双定位的实现代码
2021/04/29 HTML / CSS
Python快速优雅的批量修改Word文档样式
2021/05/20 Python
详解运行Python的神器Jupyter Notebook
2021/06/03 Python
铁头也玩根德 YachtBoy YB-230......
2022/04/05 无线电