路由设置场景如下:

路线:: resource('res','index / res');
路线:: rule('abcd /:name','index / hello');

    我们都知道在RuleGroup类中的check方法中$ rules变量其实有几种对象,第一种就是RuleItem对象:

think \ route \ RuleItem,另外一种是:think \ route \ RuleItem,$ rules变量中的内容再路由设置分析课程内容专门的介绍,这里不过不过多的讲解了,我们定位到RuleGroup类中的check方法中的foreach如下代码:

1个
2
3
4
5
6
7
8
9
<font style="vertical-align: inherit;"><font style="vertical-align: inherit;">//检查分组路由</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
foreach($ rules as $ key => $ item){</font></font><font></font>
   <font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    $ result = $ item-> check($ request,$ url,$ completeMatch); </font><font style="vertical-align: inherit;">//标注1</font></font><font></font>
   <font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    如果(false!== $ result){</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
        返回$ result;</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    }</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
}</font></font>

如上代码标注1中针对我们的路由配置存在两种场景的走向,第一种就是会请求RuleItem类中的检查方法这个在视频中做了非常详细的讲解,那么第二种就是会请求资源对象中的检查,资源这个类中并没有检查方法,但是他继承了RuleGroup类,这个类中存在检查方法,很巧的就是这个方法就是上面标黑的检查方法。

图一

然后很多小伙伴就很奇怪异怎么请求半天又回来了,哈哈,别着急,再编码过程中这种现成很正常,继续看代码如下:

图二

这个时候我们的当前对象就是资源Resource对象了,而上图二中instanceof关键字是类型处理器符用于确定一个PHP变量是否属于该类的实例,他会走到下面这个逻辑,然后请求buildResourceRule方法,这个方法实际是在ResourceRule类中,如下:

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
<font style="vertical-align: inherit;"><font style="vertical-align: inherit;">/ **</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
 *生成资源路由规则</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
 * @访问受保护</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
 * @返回无效</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
 * /</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
受保护的函数buildResourceRule()</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
{</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    $ origin = $ this-> router-> getGroup(); </font><font style="vertical-align: inherit;">// think \ route \ Domain</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    $ this-> router-> setGroup($ this);</font></font><font></font>
<font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    $ rule = $ this->资源;</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    $ option = $ this-> option;</font></font><font></font>
<font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    如果(strpos($ rule,'。')){</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
        //注册包裹资源路由</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
        array explode'。',$ rule);</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
        $ last = array_pop($ array);</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
        $ item = [];</font></font><font></font>
<font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
        foreach($ array as $ val){</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
            $ item [] = $ val。</font><font style="vertical-align: inherit;">'/ <' </font><font style="vertical-align: inherit;">(isset($ option ['var'] [$ val])?$ option ['var'] [$ val]:$ val。'_id')。</font><font style="vertical-align: inherit;">'>';</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
        }</font></font><font></font>
<font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
        $ rule = implode('/',$ item)。</font><font style="vertical-align: inherit;">'/' </font><font style="vertical-align: inherit;">$ last;</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    }</font></font><font></font>
<font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    $ prefix = substr($ rule,strlen($ this-> name)+ 1);</font></font><font></font>
<font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    //注册资源路由</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    foreach($ this-> rest as $ key => $ val){    </font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
        如果((isset($ option ['only'])&&!in_array($ key,$ option ['only']))</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
            || </font><font style="vertical-align: inherit;">(isset($ option ['except'])&& in_array($ key,$ option ['except']))){</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
            继续;</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
        }</font></font><font></font>
<font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
        if(isset($ last)&& strpos($ val [1],'<id>')&& isset($ option ['var'] [$ last])){</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
            $ val [1] = str_replace'<id>''<'。$ option ['var'] [$ last]。'>',$ val [1]);</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
        elseifstrpos($ val [1],'<id>')&& isset($ option ['var'] [$ rule])){</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
            $ val [1] = str_replace'<id>''<'$ option ['var'] [$ rule]。'>',$ val [1]);</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
        }</font></font><font></font>
<font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
        $ this-> addRule(trim($ prefix。$ val [1],'/'),$ this-> route。'/'。$ val [2],$ val [0]);</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    }</font></font><font></font>
<font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    $ this-> router-> setGroup($ origin);</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
}</font></font>

这个方法主要是对资源路由的多个场景内容做了些处理,下面图三中的内容很关键:

图三

这个地方遍历让7种资源路由重新注册到规则中($ this-> addRule()),然后请求RuleGroup中的addRule方法,如图四:

图四

这个方法我们在之前路由注册的时候做了详细的分析的,这里老师就不过讲解了,那么通过这些操作后,我们在回到图一中的check方法,这个时候他的$ rules变量就彻底变了大家可以打印出来看看效果如下:

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
<font style="vertical-align: inherit;"><font style="vertical-align: inherit;">数组(4){</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
  [0] => object(think \ route \ RuleItem)#22(10){</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    [“ hasSetRule”] => bool(true)</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    [“名称”] =>字符串(15)“ index / res / index”</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    [“ rule”] => string(3)“ res”</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    [“方法”] =>字符串(3)“获取”</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    [“ vars”] => array(0){</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    }</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    [“ option”] => array(1){</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
      [“ complete_match”] => bool(true)</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    }</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    [“ pattern”] => array(0){</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    }</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    [“ mergeOptions”] => array(6){</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
      [0] =>字符串(5)“之后”</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
      [1] => string(5)“模型”</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
      [2] => string(6)“标题”</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
      [3] => string(8)“ response”</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
      [4] =>字符串(6)“追加”</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
      [5] => string(10)“中间件”</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    }</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    [“ doAfter”] => NULL</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    [“ lockOption”] => bool(false)</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
  }</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
  [1] => object(think \ route \ RuleItem)#16(10){</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    [“ hasSetRule”] => bool(true)</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    [“名称”] =>字符串(16)“ index / res / create”</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    [“ rule”] => string(10)“ res / create”</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    [“方法”] =>字符串(3)“获取”</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    [“ vars”] => array(0){</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    }</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    [“ option”] => array(0){</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    }</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    [“ pattern”] => array(0){</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    }</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    [“ mergeOptions”] => array(6){</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
      [0] =>字符串(5)“之后”</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
      [1] => string(5)“模型”</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
      [2] => string(6)“标题”</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
      [3] => string(8)“ response”</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
      [4] =>字符串(6)“追加”</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
      [5] => string(10)“中间件”</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    }</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    [“ doAfter”] => NULL</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    [“ lockOption”] => bool(false)</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
  }</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
  [2] => object(think \ route \ RuleItem)#24(10){</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    [“ hasSetRule”] => bool(true)</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    [“名称”] =>字符串(14)“ index / res / edit”</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    [“ rule”] =>字符串(13)“ res / <id> / edit”</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    [“方法”] =>字符串(3)“获取”</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    [“ vars”] => array(0){</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    }</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    [“ option”] => array(0){</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    }</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    [“ pattern”] => array(0){</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    }</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    [“ mergeOptions”] => array(6){</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
      [0] =>字符串(5)“之后”</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
      [1] => string(5)“模型”</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
      [2] => string(6)“标题”</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
      [3] => string(8)“ response”</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
      [4] =>字符串(6)“追加”</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
      [5] => string(10)“中间件”</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    }</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    [“ doAfter”] => NULL</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    [“ lockOption”] => bool(false)</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
  }</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
  [3] => object(think \ route \ RuleItem)#23(10){</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    [“ hasSetRule”] => bool(true)</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    [“ name”] =>字符串(14)“ index / res / read”</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    [“ rule”] => string(8)“ res / <id>”</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    [“方法”] =>字符串(3)“获取”</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    [“ vars”] => array(0){</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    }</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    [“ option”] => array(0){</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    }</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    [“ pattern”] => array(0){</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    }</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    [“ mergeOptions”] => array(6){</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
      [0] =>字符串(5)“之后”</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
      [1] => string(5)“模型”</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
      [2] => string(6)“标题”</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
      [3] => string(8)“ response”</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
      [4] =>字符串(6)“追加”</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
      [5] => string(10)“中间件”</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    }</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    [“ doAfter”] => NULL</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    [“ lockOption”] => bool(false)</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
  }</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
}</font></font>

细心的同学会发现这个时候层叠里面的内容全是 

think \ route \ RuleItem

 对象了,那么这里为什么是4个而不是7个呢?留给大家思考下。然后继续走

图五

通过forach循环然后调用check方法,那么这个时候就最终走到RuleItem类中的check方法,哈哈又回到了原点,这个RuleItem类中的检查方法,然后视频中进行详细的分析。完美了。

12-28 15:57
查看更多