验证后避免 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 无法检测到,我正在使用 javascript 的 FormData()
对象,所以,我没有发送标头 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 基本身份验证重定向到 HTTPS 路由