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]);

產生錨點

支援產生URL的錨點,可以直接在URL位址參數中使用:

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');