ホームページ > php教程 > PHP源码 > 自己所理解的php路由

自己所理解的php路由

PHP中文网
リリース: 2016-05-23 08:39:14
オリジナル
1029 人が閲覧しました

1. [代码]用到的信息   

1

2

3

4

5

6

7

8

9

10

<?php

array(

    //启用路由 默认不启用

    &#39;ROUTE_ON&#39; => false,

    //路由规则

    &#39;ROUTE&#39; => array(

        //[0],[1]匹配后面的参数0,参数1 \d,\d依次表示[0],[1]的类型 正则

        //&#39;test-[0]-[1].html&#39; => array(&#39;控制器&#39;, &#39;动作&#39;, array(&#39;参数0&#39;, &#39;参数2&#39;), array(&#39;\d&#39;, &#39;\d+&#39;))

    )

);

ログイン後にコピー

2. [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

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

<?php

/**

 * Url路由

 * @author 布衣

 * QQ 780998900

 */

class Dispatcher{

 

    public static function start(){

        //检测pathinfo参数存在且启用路由则解析路由

        if($_GET[&#39;pathinfo&#39;] && C(&#39;Epoch.ROUTE_ON&#39;) == true){

            self::ParseRoute();

        }

        //获取控制器

        $Control = $_GET[C(&#39;Epoch.VAR_CONTROLLER&#39;)];

        //获取动作

        $Action  = $_GET[C(&#39;Epoch.VAR_ACTION&#39;)];

 

        //检查子域名部署模式

        //$doamin = C(&#39;Epoch.DOMAIN&#39;);

        //if(count($doamin)){

 

        //}

 

        $Control = empty($Control) ? C(&#39;Epoch.DEFAULT_CONTROLLER&#39;) : $Control;

        $Action  = empty($Action)  ? C(&#39;Epoch.DEFAULT_ACTION&#39;)     : $Action;

        $ControlPath = APP_PATH .&#39;Controller/&#39;. $Control . C(&#39;Epoch.DEFAULT_CONTROLLER_SUFFIX&#39;);

        if(file_exists($ControlPath)){

            require_once $ControlPath;

            $Controlor = $Control .&#39;Controller&#39;;

            if(class_exists($Controlor)){

                $obj = new $Controlor();

                if(method_exists($obj, $Action)){

                    $obj->$Action();

                }else{

                    self::Show(&#39;控制器动作不存在!&#39;);

                }

            }else{

                self::Show(&#39;控制器无法加载!&#39;);

            }

        }else{

            self::Show(&#39;控制器[&#39;. $ControlPath .&#39;]不存在!&#39;);

        }

    }

 

    /**

     * 编译路由

     * @param string $Controller 控制器

     * @param string $Action     动作

     * @param string $Param      参数

     * @return bool|mixed|string

     */

    public static function Route($Controller, $Action, $Param){

        $routes = C(&#39;Epoch.ROUTE&#39;);

        if(is_array($routes)){

            foreach($routes as $pattern => $route){

                $uri = false;

                //必须有控制器名和动作名

                if(empty($route[0]) || empty($route[1])){

                    continue;

                }

                //获取参数是否匹配

                preg_match_all(&#39;/[\d+]/&#39;, $pattern, $match);

                if(count($match[0]) != count($route[2])){

                    continue;

                }

                //检查控制器和动作是否相同

                if($route[0] == $Controller && $route[1] == $Action){

                    $parse = parse_url_param($Param);

                    $flag  = 1;

                    foreach($route[2] as $key => $param){

                        if(! isset($parse[$param])){

                            $flag = 0;

                            $uri  = false;

                            break;

                        }

                        //替换参数

                        $uri = str_replace(&#39;[&#39;. $key .&#39;]&#39;, $parse[$param], $pattern);

                        unset($parse[$param]);

                    }

                    //如果匹配失败 则跳过

                    if($flag == 0){

                        continue;

                    }

                    //检查是否还有剩余的参数

                    if(!empty($parse)) {

                        $extParam = &#39;?&#39;;

                        foreach ($parse as $key => $value){

                            $extParam .= $key .&#39;=&#39;. $value .&#39;&&#39;;

                        }

                        $extParam = substr($extParam, 0, -1);

                    }

                    //组装剩余的参数

                    $uri .= $extParam;

                    if($uri !== false){

                        return $uri;

                    }

                }

            }

        }

        return false;

    }

    /**

     * 解析路由

     */

    protected static function ParseRoute(){

        $routes = C(&#39;Epoch.ROUTE&#39;);

        $pathinfo = $_GET[&#39;pathinfo&#39;];

        if(! is_array($routes)){

            return;

        }

        foreach($routes as $pattern => $route){

            //组装正则表达式

            for($i = 0; $i < 10; $i++){

                $res      = isset($route[3][$i]) ? $route[3][$i] : &#39;[A-Za-z0-9]&#39;;

                $pattern  = str_replace(&#39;[&#39;. $i .&#39;]&#39;, &#39;(&#39;. $res .&#39;+)&#39;, $pattern);

            }

            $pattern  = &#39;/^&#39;. $pattern .&#39;$/&#39;;

            //匹配路由

            if(preg_match($pattern, $pathinfo, $match)){

                unset($match[0]);

                //写入数据

                $_GET[C(&#39;Epoch.VAR_CONTROLLER&#39;)] = $route[0];

                $_GET[C(&#39;Epoch.VAR_ACTION&#39;)]     = $route[1];

                foreach($match as $key => $value){

                    $_GET[$route[2][$key - 1]] = $value;

                }

            }

        }

    }

 

 

    public static function Show($msg){

        EpochException::Show($msg);

    }

}

ログイン後にコピー

                   

                   

関連ラベル:
php
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
PHP 拡張子 intl
から 1970-01-01 08:00:00
0
0
0
phpのデータ取得?
から 1970-01-01 08:00:00
0
0
0
PHP GET エラー レポート
から 1970-01-01 08:00:00
0
0
0
phpを上手に学ぶ方法
から 1970-01-01 08:00:00
0
0
0
人気のおすすめ
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート