Phi*_*oss 2 php laravel laravel-5
我了解如何通过在控制器方法中类型提示类名来验证请求。然而,对于 Ajax 请求,根据文档,我应该验证控制器中的数据,因为使用验证器类将重定向而不是发送响应。
我正在看的主要部分是:
如果传入请求是 AJAX 请求,则不会生成重定向。相反,带有 422 状态代码的 HTTP 响应将返回到浏览器,其中包含验证错误的 JSON 表示形式。
然而,我的控制器如下:
public function update(App\Permission $permission, Request $request)
{
$this->validate($request, [
'permission_description' => 'required|string'
]);
...
}
Run Code Online (Sandbox Code Playgroud)
而且我一辈子都无法让它用 JSON 进行响应。文档指出,如果失败,它会抛出Illuminate\Contracts\Validation\ValidationException异常,但我无法捕获它。
每当失败时,它总是重定向回编辑页面。显然我不想要这个,我想要 json 响应。
我刚刚尝试过“手动写出来”,整个方法确实有效,但是如果它不起作用,那么$v = Validator::make($request->all(), ...);使用这种方法有什么意义呢?$this->validate()
该$this->validate()方法是否不适用于 AJAX,而我每次都必须编写很长的代码?难道我做错了什么?!
以下是我尝试过的:
public function update(App\Permission $permission, UpdatePermissionRequest $request)
{
/** Redirects rather than returns JSON if the validation fails **/
}
----------------------------------
public function update(App\Permission $permission, Request $request)
{
$this->validate($request, [
'permission_description' => 'required|string'
]);
/** AND I've also tried: **/
try {
$this->validate($request, ['permission_description' => 'required|string']);
} catch (\Illuminate\Contracts\Validation\ValidationException $e {
echo $e; /** Echoing for debug reasons **/
exit;
}
...
/** Still redirects the browser, even if it is an AJAX request **/
}
-----------------------------------------
use Validator;
...
public function update(App\Permission $permission, Request $request)
{
$v = Validator::make($request->all(), [
'permission_description' => 'required|string'
]);
if($v->fails())
{
return response()->json(['reply' => false]);
}
/** Works **/
}
Run Code Online (Sandbox Code Playgroud)
更新
文档不正确。它声明该$this->validate()方法抛出 aIlluminate\Contracts\Validation\ValidationException但它没有抛出。它抛出Illuminate\Http\Exception\HttpResponseException异常。
小智 5
简单地告诉您希望标头中包含 json 也应该可以解决此问题。Laravel 检查请求是否是 ajax 或是否请求 json。
if ($this->ajax() || $this->wantsJson())
{
return new JsonResponse($errors, 422);
}
Run Code Online (Sandbox Code Playgroud)
解决方案:
添加标题
接受:应用程序/json