#### 路由生成
路由生成本身不屬于路由功能,屬于一種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');
~~~
* * * * *
http://www.hmoore.net/thinkphp/route-master/223116