Laravel 响应:跳回上一次的请求 1 个改进

问题

在控制器或路由中,我能否实现当用户提交的表单无效时,将用户重定向回先前的位置?

回答

要将用户重定向回先前的位置,可以使用全局辅助函数 back,其生成返回用户之前位置的重定向 HTTP 响应,并可以链式调用 withInputwithErrors 等方法带上输入值、错误提示信息等。

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 中间件。

参考

本文为 Wiki 文章,邀您参与纠错、纰漏和优化
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!