URL 產生

介紹

Laravel 提供幾個輔助函式來協助你產生 URL。當然,這些有助於在模板和 API 回應中建構連結,或產生重導回應到應用程式的另一個部分的時候。

基本用法

產生基本的 URL

url 輔助函式可被用於應用程式的任何一個 URL。被產生的 URL 會自動使用當前請求所用的傳輸協定(HTTP 或 HTTPS)和主機:

$post = App\Post::find(1);

echo url("/posts/{$post->id}");

// http://example.com/posts/1

存取當前的 URL

如果不提供路徑到 url 輔助函式,會回傳 Illuminate\Routing\UrlGenerator 實例,這可以讓你去存取關於目前 URL 的資訊:

// 未使用查詢字串來取得當前 URL...
echo url()->current();

// 使用查詢字串來取得當前 URL...
echo url()->full();

// 取得上一個請求的完整 URL...
echo url()->previous();

上面這些方法都可以透過 URL facade 來存取:

use Illuminate\Support\Facades\URL;

echo URL::current();

已命名路由的 URL

route 輔助函式可被用於產生 URL 到被命名的路由。已命名的路由可以讓你產生 URL,還不會影響到實際在路由上定義的 URL。因此,如果該路由的 URL 有被異動,就不用在去修改你的 route 函式呼叫。例如,設想你的應用程式有一個像是下面範例所定義的路由:

Route::get('/post/{post}', function () {
    //
})->name('post.show');

要產生 URL 到這個路由,你可以使用 route 輔助函式,就像是:

echo route('post.show', ['post' => 1]);

// http://example.com/post/1

你通常會使用 Eloquent 模型 的主鍵來產生 URL。出於這個緣故,你可以將 Eloquent 模型作為參數值來傳入。route 輔助函式會自動的取出模型的主鍵:

echo route('post.show', ['post' => $post]);

控制器行為的 URL

action 函式為給定控制器行為來產生一組 URL。你不需要再傳入控制器的完整命名空間。反而是傳入相對於 App\Http\Controllers 命名空間的控制器類別名稱的相對路徑:

$url = action('HomeController@index');

如果控制器方法接受路由參數,你可以將他們作為第二個參數來傳入該函式:

$url = action('UserController@profile', ['id' => 1]);

預設值

因為某些應用程式的關係,你可能希望為某些 URL 參數指定請求範圍的預設值。例如,設想你的許多路由定義了 {locale} 參數:

Route::get('/{locale}/posts', function () {
    //
})->name('post.index');

如果每次呼叫 route 輔助函式都要傳入 locale,會使開發變得很繁瑣。所以,你可以使用 URL::defaults 方法來定義這個參數的預設值,使該參數總是在當前請求期間被應用。你可能希望從路由中介層中呼叫這個方法,這樣就可以存取當前的請求:

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Support\Facades\URL;

class SetDefaultLocaleForUrls
{
    public function handle($request, Closure $next)
    {
        URL::defaults(['locale' => $request->user()->locale]);

        return $next($request);
    }
}

一旦 locale 參數的預設值被設定,你就不需要在透過 route 輔助函式來產生 URL 時傳入它的值了。