Laravel 自定义验证器 returns 页面而不是 json

Laravel custom validator returns page instead of json

我做了一个控制器来存储任务,它看起来像:

    public function store(StoreTaskRequest $request)
    {
        $validated = $request->validated();

        return response()->json($request);
    }

为了请求验证,我制作了一个自定义验证器,看起来像

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class StoreTaskRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            'project_id' => 'required',
            'project_name' => 'required',
            'task_id' => 'required',
            'task_name' => 'required',
            'startDate' => 'required',
            'endDate' => 'required',
        ];
    }

    public function messages()
    {
        return [
            'project_id.required' => 'required!',
            'project_name.required' => 'required!',
            'task_id.required' => 'required!',
            'task_name.required' => 'required!',
            'startDate.required' => 'required!',
            'endDate.required' => 'required!',
        ];
    }
}

当我用不正确的数据向那个控制器发出 post 请求时,它 returns 一个 html 页面但是当我 post 它用正确的数据 returns 请求为 json

顺便说一下,我的 post 请求是这样的:reqbin.com

Post request headers: 
X-Csrf-Token: ....
Content-Type: application/json

Post Params:
{
  "project_name": "Wiza",
  "task_id": 1,
  "task_name": "test 1",
  "startDate": {
    "week": 1,
    "start" : 11,
    "year": 2022
  },
  "endDate": {
     "week": 1,
    "start" : 11,
    "year": 2022
  }
}

有谁知道为什么它返回 html 页面而不是验证错误?

编辑:

api.php 为空 web.php

Route::post('api/v1/tasks/', [TaskController::class, 'store']);

//Also tried
Route::resource('api/v1/tasks/', TaskController::class);

我遇到了同样的问题,下面提到的方法对我有用。

Header调试

首先您需要验证 headers 列表是否存在于您的请求中。您可以按照控制器 store 方法中的以下代码执行此操作:

 public function store(StoreTaskRequest $request)
    {
       dd($request->headers); //dump your headers exists in $request

       $validated = $request->validated();       
        return response()->json($request);
    }

这将向您显示类似的内容:

解决方案:

通过使用 middleware 添加那些 headers 的最佳方式和干净的方式,即 我创建了 ForceJsonResponse 中间件。

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;

class ForceJsonResponse
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle(Request $request, Closure $next)
    {
        $request->headers->set('Accept', 'application/json');
        return $next($request);
    }
}

之后,我在 app/Http/Kernel.php 中注册了该中间件,如屏幕截图所示。

然后附加 middlewareroute,如屏幕截图所示:

laravel doc reference for middleware attachement

最坏的情况

如果还是不行那你可以用try catch语句

在您的自定义验证器中添加此代码。

/**
 * Get the error messages for the defined validation rules.*
 * @return array
 */
protected function failedValidation(ValidationValidator $validator)
{
    throw new HttpResponseException(response()->json([
        'message' => implode('', collect($validator->errors())->first()),
        'status' => true
    ], 422));
}