Laravel Ajax 验证

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