LaravelDocs(中文)

HTTP 重新導向 (HTTP Redirects)

Laravel 提供多種建立重新導向的方式

建立重新導向 (Creating Redirects)

重新導向回應是 Illuminate\Http\RedirectResponse 類別的實例,包含將使用者重新導向到另一個 URL 所需的適當標頭。有幾種方式可以產生 RedirectResponse 實例。最簡單的方法是使用全域 redirect 輔助函式:

Route::get('/dashboard', function () {
    return redirect('/home/dashboard');
});

有時你可能希望將使用者重新導向到他們之前的位置,例如當提交的表單無效時。你可以使用全域 back 輔助函式來完成。由於此功能使用 session,請確保呼叫 back 函式的路由正在使用 web middleware 群組,或者已套用所有 session middleware:

Route::post('/user/profile', function () {
    // Validate the request...

    return back()->withInput();
});

重新導向到命名路由 (Redirecting Named Routes)

當你不帶參數呼叫 redirect 輔助函式時,會回傳 Illuminate\Routing\Redirector 的實例,允許你呼叫 Redirector 實例上的任何方法。例如,要產生 RedirectResponse 到命名路由,你可以使用 route 方法:

return redirect()->route('login');

如果你的路由有參數,你可以將它們作為第二個參數傳遞給 route 方法:

// For a route with the following URI: profile/{id}

return redirect()->route('profile', ['id' => 1]);

為了方便起見,Laravel 也提供全域 to_route 函式:

return to_route('profile', ['id' => 1]);

透過 Eloquent Models 填充參數 (Populating Parameters Via Eloquent Models)

如果你要重新導向到一個帶有「ID」參數的路由,且該參數是從 Eloquent model 填充的,你可以直接傳遞 model 本身。ID 會自動被擷取:

// For a route with the following URI: profile/{id}

return redirect()->route('profile', [$user]);

如果你想要自訂放在路由參數中的值,你應該覆寫 Eloquent model 上的 getRouteKey 方法:

/**
 * Get the value of the model's route key.
 */
public function getRouteKey(): mixed
{
    return $this->slug;
}

重新導向到控制器動作 (Redirecting Controller Actions)

你也可以產生重新導向到控制器動作。為此,請將控制器和動作名稱傳遞給 action 方法:

use App\Http\Controllers\HomeController;

return redirect()->action([HomeController::class, 'index']);

如果你的控制器路由需要參數,你可以將它們作為第二個參數傳遞給 action 方法:

return redirect()->action(
    [UserController::class, 'profile'], ['id' => 1]
);

重新導向並帶入快閃 Session 資料 (Redirecting With Flashed Session Data)

重新導向到新的 URL 並將資料快閃到 session 通常是同時完成的。通常,這是在成功執行操作後將成功訊息快閃到 session 時完成的。為了方便起見,你可以在單一流暢的方法鏈中建立 RedirectResponse 實例並將資料快閃到 session:

Route::post('/user/profile', function () {
    // Update the user's profile...

    return redirect('/dashboard')->with('status', 'Profile updated!');
});

你可以使用 RedirectResponse 實例提供的 withInput 方法,在將使用者重新導向到新位置之前,將當前請求的輸入資料快閃到 session。一旦輸入被快閃到 session,你就可以在下一個請求期間輕鬆地擷取它

return back()->withInput();

使用者重新導向後,你可以從 session 顯示快閃訊息。例如,使用 Blade 語法

@if (session('status'))
    <div class="alert alert-success">
        {{ session('status') }}
    </div>
@endif