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 异常处理实现代码
Mar 10 PHP
php jq jquery getJSON跨域提交数据完整版
Sep 13 PHP
php自定义session示例分享
Apr 22 PHP
微信支付开发教程(一)微信支付URL配置
May 28 PHP
两种php给图片加水印的实现代码
Apr 18 PHP
PHP经典算法集锦【经典收藏】
Sep 14 PHP
php获取今日开始时间和结束时间的方法
Feb 27 PHP
PHP+MYSQL实现读写分离简单实战
Mar 13 PHP
php使用PDO下exec()函数查询执行后受影响行数的方法
Mar 28 PHP
Yii 2.0如何使用页面缓存方法示例
May 23 PHP
源码分析 Laravel 重复执行同一个队列任务的原因
Dec 25 PHP
PHP的mysqli_select_db()函数讲解
Jan 23 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使用ZipArchive函数实现文件的压缩与解压缩
2015/10/27 PHP
PHP面向对象程序设计内置标准类,普通数据类型转为对象类型示例
2019/06/12 PHP
JS JavaScript获取Url参数,src属性参数
2021/03/09 Javascript
JavaScript 在各个浏览器中执行的耐性
2009/04/06 Javascript
用js实现trim()的解决办法
2013/04/16 Javascript
jquery动态增加text元素以及删除文本内容实例代码
2013/07/01 Javascript
innerText 使用示例
2014/01/23 Javascript
JavaScript中的公有、私有、特权和静态成员用法分析
2014/11/20 Javascript
什么是 AngularJS?AngularJS简介
2014/12/06 Javascript
node.js中的fs.readlink方法使用说明
2014/12/17 Javascript
限制上传文件大小和格式的jQuery插件实例
2015/01/24 Javascript
jQuery实现鼠标划过展示大图的方法
2015/03/09 Javascript
JavaScript中的立即执行函数表达式介绍
2015/03/15 Javascript
Jquery基础之事件操作详解
2016/06/14 Javascript
微信小程序开发之视频播放器 Video 弹幕 弹幕颜色自定义实例
2016/12/08 Javascript
如何获取元素的最终background-color
2017/02/06 Javascript
vue项目中使用tinymce编辑器的步骤详解
2018/09/11 Javascript
Angular ElementRef简介及其使用
2018/10/01 Javascript
读懂CommonJS的模块加载
2019/04/19 Javascript
JS使用正则表达式判断输入框失去焦点事件
2019/10/16 Javascript
Python实现批量转换文件编码的方法
2015/07/28 Python
matplotlib 输出保存指定尺寸的图片方法
2018/05/24 Python
python数据类型可变不可变知识点总结
2020/03/06 Python
python编写俄罗斯方块
2020/03/13 Python
pytorch 常用函数 max ,eq说明
2020/06/28 Python
python 怎样进行内存管理
2020/11/10 Python
CSS3 优势以及网页设计师如何使用CSS3技术
2009/07/29 HTML / CSS
CSS3基础(RGBa、text-shadow、box-shadow、border-radius)
2012/11/13 HTML / CSS
欧洲著名的珠宝和手表网上商城:uhrcenter
2017/04/10 全球购物
德国拖鞋网站:German Slippers
2019/11/08 全球购物
高校学生干部的自我评价分享
2013/11/04 职场文书
公司清洁工岗位职责
2013/12/14 职场文书
合作协议书范本
2014/04/17 职场文书
销售员岗位职责范本
2015/04/11 职场文书
优质服务心得体会(共4篇)
2016/01/22 职场文书
导游词之安徽九华山
2019/09/18 职场文书