laravel
重定向文件

创建重定向

重定向响应是 Illuminate\Http\RedirectResponse 类的实例,并包含将用户重定向到另一个 URL 所需的正确标头。有几种方法可以生成 RedirectResponse 实例。最简单的方法是使用全局 redirect 辅助函数:

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

有时您可能希望将用户重定向到他们之前的位置,例如当提交的表单无效时。您可以使用全局 back 辅助函数来实现。由于此功能利用了会话,请确保调用 back 函数的路由正在使用 web 中间件组或已应用所有会话中间件:

Route::post('/user/profile', function () {
    // 验证请求...

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

重定向到命名路由

当您调用不带参数的 redirect 助手时,会返回一个 Illuminate\Routing\Redirector 的实例,允许您在 Redirector 实例上调用任何方法。例如,要生成一个重定向到命名路由的 RedirectResponse,您可以使用 route 方法:

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

如果您的路由具有参数,您可以将它们作为第二个参数传递给 route 方法:

// 对于具有以下 URI 的路由:profile/{id}
 
return redirect()->route('profile', ['id' => 1]);

为了方便起见,Laravel 还提供了全局的 to_route 函数:

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

通过 Eloquent 模型填充参数

如果您要重定向到一个路由,其中的“ID”参数是从 Eloquent 模型中填充的,您可以传递模型本身。ID 将自动被提取:

// 对于具有以下 URI 的路由:profile/{id}
 
return redirect()->route('profile', [$user]);

如果您想要自定义放置在路由参数中的值,您应该在您的 Eloquent 模型上重写 getRouteKey 方法:

/**
 * 获取模型路由键的值。
 */
public function getRouteKey(): mixed
{
    return $this->slug;
}

重定向到控制器操作

您也可以生成重定向到控制器操作。为此,将控制器和操作名称传递给 action 方法:

use App\Http\Controllers\HomeController;
 
return redirect()->action([HomeController::class, 'index']);

如果您的控制器路由需要参数,您可以将它们作为第二个参数传递给 action 方法:

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

使用闪存会话数据进行重定向

将用户重定向到新的 URL 并将会话数据闪存到会话中通常是同时进行的。通常,在成功执行操作后会这样做,例如将会话中的成功消息闪存到会话中。为了方便起见,您可以创建一个RedirectResponse实例,并在一个流畅的方法链中将会话数据闪存到会话中:

Route::post('/user/profile', function () {
    // 更新用户的个人资料...
 
    return redirect('/dashboard')->with('status', '个人资料已更新!');
});

您可以使用RedirectResponse实例提供的withInput方法,在将用户重定向到新位置之前,将会话的当前请求输入数据闪存到会话中。一旦将输入闪存到会话中,您可以在下一个请求中轻松地检索它

return back()->withInput();

在用户被重定向后,您可以从会话中显示闪存消息。例如,使用Blade 语法

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