服务器之家

服务器之家 > 正文

PHP实现路由映射到指定控制器

时间:2021-02-23 15:50     来源/作者:陶士涵

自定义路由的功能,指定到pathinfo的url上,再次升级之前的脚本 

simpleloader.php

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
<?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 

?
1
2
3
4
5
6
7
8
9
<?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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?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实现路由映射到指定控制器

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

标签:

相关文章

热门资讯

2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全 2019-12-26
yue是什么意思 网络流行语yue了是什么梗
yue是什么意思 网络流行语yue了是什么梗 2020-10-11
Intellij idea2020永久破解,亲测可用!!!
Intellij idea2020永久破解,亲测可用!!! 2020-07-29
背刺什么意思 网络词语背刺是什么梗
背刺什么意思 网络词语背刺是什么梗 2020-05-22
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总 2020-11-13
返回顶部