验证后避免 Laravel 重定向

Posted

技术标签:

【中文标题】验证后避免 Laravel 重定向【英文标题】:Avoid Laravel redirect after validation 【发布时间】:2020-11-02 23:34:38 【问题描述】:

我在我的 Laravel 控制器上做一个简单的验证:

public function updateInfo(Request $request) 

        $validator = $request->validate([
            "name" => ["string", "nullable"],
            "email" => ["email", "nullable"],
            "currentPassword" => ["password:api"]
        ]);

        return json_encode($validator);

我的问题是,如果验证失败,这个验证会将我重定向到家,并且我通过 AJAX 发出请求,我知道 Laravel 检测到请求何时通过 Ajax,但它仅在是正常请求时才有效(典型的请求,其中我使用Content Type application/json 发送标头,在正文中我发送了一个普通的 JSON

但是当 te Ajax 请求不是 Content Type application/json 时,Laravel 无法检测到,我正在使用 javascriptFormData() 对象,所以,我没有发送标头 Content Type application/json,并且在正文中我发送了 FormData 对象。

我认为它模拟了重新加载页面的典型 HTTP 请求,因此 Laravel 无法检测到它,但它给我的 ajax 响应带来了麻烦,因为 Laravel 响应重定向并且在我的 Ajax 响应中我正在捕捉主页的 html 代码。

我能做什么?

【问题讨论】:

使用手动验证器:laravel.com/docs/7.x/validation#manually-creating-validators 如果验证失败,您将完全控制如何处理。 我试过了,现在我可以捕获错误,但是现在当我使用$validator->errors()->all() 获取错误数组时,它只给了我错误的关键:["validation.password"] 但消息是不在场,你知道发生了什么吗? 我没有想到,因为 Validator 类有点奇怪。 $validator->errors()(没有->all())应该返回你正在寻找的我认为?作为参考,这里使用的是 Validator 和 MessageBag 类:laravel.com/api/7.x/Illuminate/Contracts/Validation/… 和 laravel.com/api/7.x/Illuminate/Support/MessageBag.html(通过 $validator->errors() 是的,但是它返回一个数组,该数组带有键,我发现了问题,我没有在我的 lang 文件中定义该索引,谢谢!!! 啊,有道理!顺便说一句,我的评论只是为您指明正确的方向;您应该将您的解决方案作为答案发布,或者,如果以下解决方案之一有帮助,请考虑对其进行投票和/或接受其中一个(您做到了,干杯!) 【参考方案1】:

您可以将validator() 辅助函数与validate() 方法一起使用,它将帮助您进行AJAX 调用和普通调用

validator($request->all(), [
    "name" => ["string", "nullable"],
    "email" => ["email", "nullable"],
    "currentPassword" => ["password:api"]
])->validate();

【讨论】:

以上是关于验证后避免 Laravel 重定向的主要内容,如果未能解决你的问题,请参考以下文章

在 Laravel 5 中进行身份验证后重定向

登录后 Laravel 基本身份验证重定向到 HTTPS 路由

Laravel如何在自动重定向验证后发送参数以查看

验证失败后,Laravel 4 将输入重定向回页面

Laravel - 身份验证重定向到带有 302 找到代码的页面

Laravel 验证器抛出异常而不是重定向回来