路由设置场景如下:
路线:: 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;" > } elseif ( strpos ($ 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类中的检查方法,然后视频中进行详细的分析。完美了。