URL生成
URL產生使用 \think\facade\Route::buildUrl() 方法即可。
該方法會傳回一個think\route\Url物件實例,因為使用了__toString方法,因此可以直接輸出路由位址。
echo \think\facade\Route::buildUrl();
如果是透過資料回傳客戶端,你可以先強制轉換為字串類型後再回傳。
$url = (string) \think\facade\Route::buildUrl();
使用路由標識
對使用不同的路由位址方式,位址表達式的定義有所區別。參數單獨透過第二個參數傳入,假設我們定義了一個路由規則如下:
Route::rule('blog/:id','index/blog/read');
在沒有指定路由標識的情況下,可以直接使用路由位址來產生URL位址:
Route::buildUrl('index/blog/read', ['id' => 5, 'name' => 'thinkphp']);
如果我們在註冊路由的時候指定了路由標識
Route::rule('blog/:id','index/blog/read')->name('blog_read');
那麼必須使用路由標識來產生URL位址
Route::buildUrl('blog_read', ['id' => 5, 'name' => 'thinkphp']);
以上方法都會產生下面的URL位址:
/index.php/blog/5/name/thinkphp.html
如果你的環境支援REWRITE,那麼產生的URL位址會變成:
/blog/5/name/thinkphp.html
如果你設定了:
'url_common_param'=>true
那麼產生的URL位址變成:
/index.php/blog/5.html?name=thinkphp
不在路由規則裡面的變數會直接使用普通URL參數的方式。
要注意的是,URL位址產生不會偵測路由的有效性,只是依照給定的路由位址和參數產生符合條件的路由規則。
使用路由位址
我們也可以直接使用路由位址來產生URL,例如:
我們定義了路由規則如下:
Route::get('blog/:id' , 'blog/read');
可以使用下面的方式直接使用路由規則產生URL位址:
Route::buildUrl('/blog/5');
那麼自動產生的URL位址變成:
/index.php/blog/5.html
URL後綴
預設情況下,系統會自動讀取url_html_suffix設定參數作為URL後綴(預設為html),如果我們設定了:
'url_html_suffix' => 'shtml'
那麼自動產生的URL位址變為:
/index.php/blog/5.shtml
如果我們設定了多個URL後綴支援
'url_html_suffix' => 'html|shtml'
則會取第一後綴來產生URL位址,所以自動產生的URL位址還是:
/index.php/blog/5.html
如果你希望指定URL後綴生成,則可以使用:
Route::buildUrl('blog/read', ['id'=>5])->suffix('shtml');
網域產生
預設產生的URL位址是不帶網域的,如果你採用了多域名部署或希望產生帶有網域名稱的URL位址的話,就需要傳入第四個參數,該參數有兩種用法:
自動產生網域名稱
Route::buildUrl('index/blog/read', ['id'=>5]) ->suffix('shtml') ->domain(true);
第四個參數傳入true的話,表示自動產生域名,如果你開啟了url_domain_deploy還會自動辨識出符合目前URL規則的網域。
例如,我們註冊了網域路由資訊如下:
Route::domain('blog','index/blog');
那麼上面的URL位址產生為:
http://blog.thinkphp.cn/read/id/5.shtml
指定網域
Route::buildUrl('blog/read', ['id'=>5])->domain('blog');或是傳入完整的域名
Route::buildUrl('index/blog/read', ['id'=>5])->domain('blog.thinkphp.cn');產生的URL位址為:
http://blog.thinkphp.cn/read/id/5.shtml也可以直接在第一個參數裡面傳入域名,例如:
Route::buildUrl('index/blog/read@blog', ['id'=>5]); Route::buildUrl('index/blog/read@blog.thinkphp.cn', ['id'=>5]);
產生錨點
Route::buildUrl('index/blog/read#anchor@blog', ['id'=>5]);
錨點和網域一起使用的時候,注意錨點在前面,網域在後面。
產生的URL位址為:
http://blog.thinkphp.cn/read/id/5.html#anchor
加上入口檔案
有時候我們產生的URL位址可能需要加上index .php或去掉index.php,大多數時候系統會自動判斷,如果發現自動產生的位址有問題,可以使用下面的方法:
Route::buildUrl('index/blog/read', ['id'=>5])->root('/index.php');
助手函數
系統提供了一個url助手函數用於完成相同的功能,例如:
url('index/blog/read', ['id'=>5])->suffix('html')->domain(true)->root('/index.php');