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 七大优势分析
Jun 23 PHP
php中$_SERVER[PHP_SELF] 和 $_SERVER[SCRIPT_NAME]之间的区别
Sep 05 PHP
php记录日志的实现代码
Aug 08 PHP
PHP5.3的垃圾回收机制(动态存储分配方案)深入理解
Dec 10 PHP
解析php框架codeigniter中如何使用框架的session
Jun 24 PHP
解析php中获取系统信息的方法
Jun 25 PHP
ubuntu12.04使用c编写php扩展模块教程分享
Dec 25 PHP
php计算两个日期相差天数的方法
Mar 14 PHP
php获取指定范围内最接近数的方法
Jun 02 PHP
Zend Framework动作助手(Zend_Controller_Action_Helper)用法详解
Mar 05 PHP
基于CI框架的微信网页授权库示例
Nov 25 PHP
TP3.2批量上传文件或图片 同名冲突问题的解决方法
Aug 01 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分页示例代码
2007/03/19 PHP
php结合ACCESS的跨库查询功能
2015/06/12 PHP
php实现数组纵向转横向并过滤重复值的方法分析
2017/05/29 PHP
PHP基于堆栈实现的高级计算器功能示例
2017/09/15 PHP
PHP多个图片压缩成ZIP的方法
2020/08/18 PHP
iframe里面的元素触发父窗口元素事件的jquery代码
2014/10/19 Javascript
浅析javascript操作 cookie对象
2014/12/26 Javascript
JS实现当前页居中分页效果的方法
2015/06/18 Javascript
页面get请求 中文参数方法乱码问题的快速解决方法
2016/05/31 Javascript
Vue.js每天必学之表单控件绑定
2016/09/05 Javascript
vue制作加载更多功能的正确打开方式
2016/10/12 Javascript
Bootstrap 中data-[*] 属性的整理
2018/03/13 Javascript
如何用原生js写一个弹窗消息提醒插件
2019/05/24 Javascript
[01:22:29]真视界:2019年国际邀请赛总决赛
2020/01/29 DOTA
在Python程序中操作MySQL的基本方法
2015/07/29 Python
玩转python爬虫之爬取糗事百科段子
2016/02/17 Python
Python操作Excel之xlsx文件
2017/03/24 Python
windows下Virtualenvwrapper安装教程
2017/12/13 Python
Python基于Tkinter模块实现的弹球小游戏
2018/12/27 Python
python五子棋游戏的设计与实现
2019/06/18 Python
pyinstaller打包opencv和numpy程序运行错误解决
2019/08/16 Python
Python爬虫Scrapy框架CrawlSpider原理及使用案例
2020/11/20 Python
Booking.com荷兰:全球酒店网上预订
2017/08/22 全球购物
Bose法国官网:购买耳机、扬声器、家庭影院、专业音响
2017/12/21 全球购物
Lululemon英国官网:加拿大瑜伽服装品牌
2019/01/14 全球购物
乌克兰电子和家用电器商店:Foxtrot
2019/07/23 全球购物
毕业生自荐信的主要内容
2013/10/29 职场文书
晚宴邀请函范文
2014/01/15 职场文书
岗位竞聘书范文
2014/03/31 职场文书
元旦联欢会策划方案
2014/06/11 职场文书
破坏寝室公物检讨书
2014/11/17 职场文书
2014三年级班主任工作总结
2014/12/05 职场文书
春节晚会开场白
2015/05/29 职场文书
投资入股协议书
2016/03/22 职场文书
创业计划书之校园跑腿公司
2019/09/24 职场文书
MySQL事务操作的四大特性以及并发事务问题
2022/04/12 MySQL