服务器环境: phpstudy8.1
PHP环境版本:7.2 nts
Apache版本: 2.4.39
.htaccess配置 :
<IfModule mod_rewrite.c>
Options +FollowSymlinks -Multiviews
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php [L,E=PATH_INFO:$1]
</IfModule>Config.php配置全部默认 // URL普通方式参数 用于自动生成
'url_common_param' => false,
// URL参数方式 0 按名称成对解析 1 按顺序解析
'url_param_type' => 0,路由定义文件Route.php清空实例比对,这样就不用过于抽象的分析了
①: 'goods/:brand' => 'home/goods/lists',
②: 'goods/:brand/:class' => 'home/goods/lists',此时,生成路由规则对应的URLurl('home/goods/lists', ['brand' => 'apple']);再多加一个变量url('home/goods/lists', ['brand' => 'apple', 'class'=>'phone']);输出的结果如下:第一条
/goods/apple.html
第二条
/goods/apple/class/phone.html应该会有人好奇吧,为什么第二条的结果不是想的键值对的那样/goods/brand/apple/class/phone.html
这是因为url()的替换规则是将我们传入的变量,直接替换路由规则里第一个参数变量,同时路由成功匹配到规则后就不会再继续匹配后边的规则,而且最后形成的地址是
比如路由规则①下生成
/goods/apple + 后缀名=/goods/apple.html 规则②下生成/goods/apple/class/phone + 后缀名=/goods/apple/class/phone.html如果这时我们把配置信息改为url_param_type' => 1是不是就一模一样了现在按照这样的逻辑,将上边的路由地址互相位置,变为
Route::rule('goods/:brand/:class', 'home/goods/lists');
Route::rule('goods/:brand','home/goods/lists');结果输出就成为:/goods/apple/:class.html
/goods/apple/phone.html:class也被当做了brand变量的一部分出现了,感兴趣的小伙伴可以看源码文件
thinkphp/library/think/route.php
setRule()函数 路由规则设定的逻辑实现
parseVar()函数 解析路由规则中的变量
thinkphp/library/think/url.php
build()函数 参数组装部分其中变量解析部分的,$optional标识和三元表达式$var[$name] = $optional ? 2 : 1;的逻辑结合真的很精髓,这和前几行的正则表达式解析结果对应的很完美,又对以后的数据处理创建了环境,当然还有很多地方都有这样的精彩写法。抛砖引玉,本质上没有什么太难的地方,就是理顺一个思路,如果出现自己找不到问题的地方,优先去跑一下xdebug,然后通过证明题的思路,设定结果找前提,设定环境找原因,以上是新手的建议,这样慢慢会将抽象的问题具体化,不至于跑偏,老手自己用测试工具跑比较黑盒的东东,不在讨论范围了。
真的是程序员脑瓜子都是秃顶的,这话真的不假呦~
文字能力有限,白话文一篇。
最佳答案