#### 路由生成
路由生成本身不属于路由功能,属于一种URL生成功能,只是在URL生成的时候会根据注册的路由规则动态生成期望的URL地址,尤其适合那些路由规划经常变动的项目,5.0的URL生成非常高效,您不用担心影响生成的性能。
路由生成调用的是think\Url类的build方法,用法为:
> think\Url::build('路由地址','变量','是否显示伪静态后缀','是否显示域名')
为了方便在模板中调用,系统提供了url助手函数:
> url('路由地址','变量','是否显示伪静态后缀','是否显示域名')
#### 常规路由生成
路由生成对于一般的路由规则生成很简单,第一个参数是传入路由地址,这个地址必须和路由规则中定义的路由地址保持(大小写)一致,例如:
~~~
Route::get('blog/:id' , 'index/Blog/read');
Route::get('user/:id' , 'index/GroupUser/read');
~~~
如果希望生成上面的两个路由访问URL,则可以使用:
~~~
echo Url::build('index/Blog/read','id=6');
echo Url::build('index/GroupUser/read','id=8');
~~~
第二个参数是URL变量(包括路由变量和额外变量,路由变量除非可选否则是必须传入的),这个参数支持字符串和数组两种方式,所以下面的写法是等效的:
~~~
echo Url::build('index/Blog/read',['id'=>6]);
echo Url::build('index/GroupUser/read',['id'=>8]);
~~~
字符串变量写法`id=6&name=thinkphp`等效于数组写法` [ 'id'=>6, 'name' => 'thinkphp' ]`。
最终生成的URL地址可能是:
~~~
/blog/6.html
/user/8.html
~~~
如果还传入了额外的变量的话,会自动附加在URL地址后面:
~~~
echo Url::build('index/Blog/read','id=6&name=tp');
echo Url::build('index/GroupUser/read','id=8&name=tp');
~~~
最终生成的URL地址可能是:
~~~
/blog/6/name/tp.html
/user/8/name/tp.html
~~~
要避免在路由生成的时候犯一些容易忽视的错误,下面则是错误的用法:
~~~
// 没有传入必须的id路由变量
echo Url::build('index/Blog/read');
// 路由地址不一致
echo Url::build('Blog/read');
// 控制器大小写不一致
echo Url::build('index/blog/read','id=6');
// 控制器不一致
echo Url::build('index/groupuser/read','id=8');
~~~
上面几种用法都会导致无法正确匹配路由规则,然后就会按照实际传入的地址来生成,因此最后实际生成的地址显然不是我们希望的:
~~~
/index/Blog/read.html
/index/Blog/read.html
/index/blog/read/id/6.html
/index/groupuser/read/id/8.html
~~~
系统的路由生成都是根据路由地址生成的,实事上在注册路由地址的时候就会自动生成一个路由规则和路由地址的映射关系,我们称为路由标识,所以根据路由地址可以快速的匹配路由规则来生成URL地址,这就是ThinkPHP5路由地址生成的原理。
我们可以手动给路由规则指定路由标识,例如;
~~~
Route::get(['blog_read','blog/:id'] , 'index/Blog/read');
Route::get(['user_read','user/:id'] , 'index/GroupUser/read');
~~~
路由地址生成的方法需要改为:
~~~
echo Url::build('blog_read','id=6');
echo Url::build('user_read','id=8');
~~~
最终生成的URL地址仍然是:
~~~
/blog/6.html
/user/8.html
~~~
在路由生成的时候主要会检查路由地址和路由变量(可选变量可以不传),路由生成不检查请求类型、变量规则和路由参数。
如果路由规则如下:
~~~
Route::get('hello/[:name]' , 'index/Index/hello');
Route::get('blog/:id' , 'index/Blog/read');
Route::post('blog' , 'index/Blog/save');
Route::put('blog/:id' , 'index/Blog/update');
~~~
路由生成代码为:
~~~
echo Url::build('index/Index/hello');
echo Url::build('index/Index/hello','name=thinkphp');
echo Url::build('index/Blog/read','id=8');
echo Url::build('index/Blog/save');
echo Url::build('index/Blog/update','id=8');
~~~
生成的URL地址是:
~~~
/hello.html
/hello/thinkphp.html
/blog/8.html
/blog.html
/user/8.html
~~~
如果你的路由地址经常会变化,可以在定义路由的时候给路由定义一个别名(注意和别名路由区分开来),路由定义的时候第一个参数使用数组表示的话,第一个元素就是当前路由的别名,例如:
~~~
Route::get(['blog','blog/:id'] , 'index/Blog/read');
~~~
这里blog就是blog/:id路由的一个别名。
路由别名对URL访问没有任何作用,只是用于路由生成。
无论以后路由地址如何变化,我们始终可以用下面的方式生成URL地址。
~~~
echo Url::build('blog','id=8');
~~~
* * * * *
https://www.kancloud.cn/thinkphp/route-master/223116