Laravel 响应:跳回上一次的请求
问题
在控制器或路由中,我能否实现当用户提交的表单无效时,将用户重定向回先前的位置?
回答
要将用户重定向回先前的位置,可以使用全局辅助函数 back
,其生成返回用户之前位置的重定向 HTTP 响应,并可以链式调用 withInput
、withErrors
等方法带上输入值、错误提示信息等。
Route::post('user/profile', function () {
//验证请求
return back()->withInput();
});
也可以调用 Redirect 门面的 back()
方法:
Route::post('user/profile', function () {
//验证请求
return Redirect::back()->withInput();
});
back
函数源码:
/**
* Create a new redirect response to the previous location.
*
* @param int $status
* @param array $headers
* @param mixed $fallback
* @return \Illuminate\Http\RedirectResponse
*/
function back($status = 302, $headers = [], $fallback = false)
{
return app('redirect')->back($status, $headers, $fallback);
}
可以看到,我们还可在 back
函数中根据需要指定状态码、头信息及回退 URL,并且它只是简单地调用 Redirector
类的 back
方法,继续跟踪该方法的源码:
vendor\laravel\framework\src\Illuminate\Routing\Redirector.php
/**
* Create a new redirect response to the previous location.
*
* @param int $status
* @param array $headers
* @param mixed $fallback
* @return \Illuminate\Http\RedirectResponse
*/
public function back($status = 302, $headers = [], $fallback = false)
{
return $this->createRedirect($this->generator->previous($fallback), $status, $headers);
}
createRedirect
方法的源码:
/**
* Create a new redirect response.
*
* @param string $path
* @param int $status
* @param array $headers
* @return \Illuminate\Http\RedirectResponse
*/
protected function createRedirect($path, $status, $headers)
{
return tap(new RedirectResponse($path, $status, $headers), function ($redirect) {
if (isset($this->session)) {
$redirect->setSession($this->session);
}
$redirect->setRequest($this->generator->getRequest());
});
}
注意:由于重定向回先前的位置利用了 HTTP 会话机制,因此须确保调用 back
函数或方法的路由使用 web
中间件组或所有 Session 中间件。