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 相关文章推荐
vBulletin HACK----关于排版的两个HACK
Oct 09 PHP
PHP取整数函数常用的四种方法小结
Jul 05 PHP
set_include_path和get_include_path使用及注意事项
Feb 02 PHP
PHP错误和异长常处理总结
Mar 06 PHP
PHP实现懒加载的方法
Mar 07 PHP
php类常量用法实例分析
Jul 09 PHP
使用php-timeit估计php函数的执行时间
Sep 06 PHP
PHP判断字符串长度的两种方法很实用
Sep 22 PHP
PHP list() 将数组中的值赋给变量的简单实例
Jun 13 PHP
php代码检查代理ip的有效性
Aug 19 PHP
Mac版PhpStorm之XAMPP整合apache服务器配置的图文教程详解
Oct 13 PHP
PHP仿微信发红包领红包效果
Oct 30 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
删除及到期域名的查看(抢域名必备哦)
2008/05/14 PHP
PHP常用技巧总结(附函数代码)
2012/02/04 PHP
php中3种方法删除字符串中间的空格
2014/03/10 PHP
一个非常完美的读写ini格式的PHP配置类分享
2015/02/12 PHP
Yii2框架实现登陆添加验证码功能示例
2018/07/12 PHP
深入理解 PHP7 中全新的 zval 容器和引用计数机制
2018/10/15 PHP
javascript 写类方式之五
2009/07/05 Javascript
在UpdatePanel内jquery easyui效果失效的解决方法
2010/04/11 Javascript
自定义ExtJS控件之下拉树和下拉表格附源码
2013/10/15 Javascript
深入理解Javascript动态方法调用与参数修改的问题
2013/12/10 Javascript
JavaScript sup方法入门实例(把字符串显示为上标)
2014/10/20 Javascript
jQuery中append()方法用法实例
2014/12/25 Javascript
JavaScript缓冲运动实现方法(2则示例)
2016/01/08 Javascript
vue中使用极验验证码的方法(附demo)
2019/12/04 Javascript
vue微信分享插件使用方法详解
2020/02/18 Javascript
[02:14]2016国际邀请赛中国区预选赛Ehome晋级之路
2016/07/01 DOTA
Python程序设计入门(1)基本语法简介
2014/06/13 Python
python非递归全排列实现方法
2017/04/10 Python
python编程实现随机生成多个椭圆实例代码
2018/01/03 Python
Python远程开发环境部署与调试过程图解
2019/12/09 Python
pytorch实现建立自己的数据集(以mnist为例)
2020/01/18 Python
python FTP编程基础入门
2021/02/27 Python
HTML5通用接口详解
2016/06/12 HTML / CSS
de Bijenkorf比利时官网:荷兰最知名的百货商店
2017/06/29 全球购物
新西兰最大的品牌运动鞋购物网站:Platypus NZ
2017/10/27 全球购物
Shopee菲律宾:在线购买和出售
2019/11/25 全球购物
动物学专业毕业生求职信
2013/10/11 职场文书
公司部门司机岗位职责
2014/01/03 职场文书
纺织工程专业个人求职信范文
2014/01/27 职场文书
英语专业职业生涯规划范文
2014/03/05 职场文书
元旦文艺汇演主持词
2014/03/26 职场文书
中职三好学生事迹材料
2014/08/24 职场文书
库房管理员岗位职责
2015/02/12 职场文书
初中生思想道德自我评价
2015/03/09 职场文书
MySQL学习之基础命令实操总结
2022/03/19 MySQL
解决vue-router的beforeRouteUpdate不能触发
2022/04/14 Vue.js