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提取中文首字母
Apr 09 PHP
PHP函数之error_reporting(E_ALL ^ E_NOTICE)详细说明
Jul 01 PHP
PHP 删除文件与文件夹操作 unlink()与rmdir()这两个函数的使用
Jul 17 PHP
使用JSON实现数据的跨域传输的php代码
Dec 20 PHP
php ci框架验证码实例分析
Jun 26 PHP
php中stream(流)的用法
Mar 25 PHP
Laravel 5框架学习之日期,Mutator 和 Scope
Apr 08 PHP
php实现用于计算执行时间的类实例
Apr 18 PHP
php获取从百度、谷歌等搜索引擎进入网站关键词的方法
Jul 08 PHP
php实现登陆模块功能示例
Oct 20 PHP
解决PHP程序运行时:Fatal error: Maximum execution time of 30 seconds exceeded in的错误提示
Nov 25 PHP
YII框架行为behaviors用法示例
Apr 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
Warning: session_destroy() : Trying to destroy uninitialized sessionq错误
2011/06/16 PHP
在phpstudy集成环境下的nginx服务器下配置url重写
2019/12/02 PHP
再次更新!MSClass (Class Of Marquee Scroll通用不间断滚动JS封装类 Ver 1.6)
2007/02/05 Javascript
De facto standard 世界上不可思议的事实标准
2010/08/29 Javascript
jQuery lazyLoad图片延迟加载插件的优化改造方法分享
2013/08/13 Javascript
固定网页背景图同时保持图片比例的思路代码
2013/08/15 Javascript
Javascript添加监听与删除监听用法详解
2014/12/19 Javascript
jquery.form.js实现将form提交转为ajax方式提交的方法
2015/04/07 Javascript
jquery中ready()函数执行的时机和window的load事件比较
2015/06/22 Javascript
jQuery.cookie.js实现记录最近浏览过的商品功能示例
2017/01/23 Javascript
JavaScript中从setTimeout与setInterval到AJAX异步
2017/02/13 Javascript
jQuery 实现批量提交表格多行数据的方法
2018/08/09 jQuery
vue实现的微信机器人聊天功能案例【附源码下载】
2019/02/18 Javascript
JS实现关闭小广告特效
2021/01/29 Javascript
JavaScript中break、continue和return的用法区别实例分析
2020/03/02 Javascript
[02:29]完美世界高校联赛上海赛区回顾
2015/12/15 DOTA
[01:11:37]完美世界DOTA2联赛PWL S2 SZ vs FTD.C 第一场 11.19
2020/11/19 DOTA
[01:04:08]完美世界DOTA2联赛PWL S3 INK ICE vs GXR 第一场 12.16
2020/12/18 DOTA
python中使用pyhook实现键盘监控的例子
2014/07/18 Python
python实现判断数组是否包含指定元素的方法
2015/07/15 Python
python实现学生管理系统
2018/01/11 Python
python实现多线程行情抓取工具的方法
2018/02/28 Python
Python多进程与服务器并发原理及用法实例分析
2018/08/21 Python
解决Tensorboard 不显示计算图graph的问题
2020/02/15 Python
Python实现AI换脸功能
2020/04/10 Python
Python基于yaml文件配置logging日志过程解析
2020/06/23 Python
python实现图片素描效果
2020/09/26 Python
python装饰器代码深入讲解
2021/03/01 Python
纯css3实现的鼠标悬停动画按钮
2014/12/23 HTML / CSS
String、StringBuffer、StringBuilder有区别
2015/09/18 面试题
写给老师的表扬信
2014/01/21 职场文书
美国留学经济担保书
2014/05/20 职场文书
开会通知短信大全
2015/04/20 职场文书
毕业生学校组织意见
2015/06/04 职场文书
MySQL pt-slave-restart工具的使用简介
2021/04/07 MySQL
解决Navicat for MySQL 连接 MySQL 报2005错误的问题
2021/05/29 MySQL