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

2025-05-29 0 53

自定义路由的功能,指定到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实现路由映射到指定控制器

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

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 PHP实现路由映射到指定控制器 https://www.kuaiidc.com/96727.html

相关文章

发表评论
暂无评论