【问题标题】:The custom messages doesn't returned from FormRequest in my app based on Laravel 9.8.1在基于 Laravel 9.8.1 的应用程序中,自定义消息不会从 FormRequest 返回
【发布时间】:2023-01-09 08:00:53
【问题描述】:

接下来是我的 FormRequest:

    <?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class StoreFruitRequest 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 [
        'name' => 'required|string|min:3',
        'carbohydrates' => 'required|numeric|gte:0',
        'protein' => 'required|numeric|gte:0',
        'fat' => 'required|numeric|gte:0',
        'calories' => 'required|integer|numeric|gte:0',
        'sugar' => 'required|numeric|gte:0',
    ];
}

/**
 * Error Messages
 *
 * @return array
 */
public function messages() :array
{
    return [
        'carbohydrates.gte' => 'Nutrients cannot be negative',
        'protein.gte' => 'Nutrients cannot be negative',
        'fat.gte' => 'Nutrients cannot be negative',
        'calories.gte' => 'Nutrients cannot be negative',
        'sugar.gte' => 'Nutrients cannot be negative',
    ];
}
}

验证规则工作正常,但是当我使用错误的值(负数)发出请求时,验证不会将这些消息返回给控制器。因此,我的 API 将主刀片页面作为错误返回。

我的代码中有什么不正确的地方?或者,我需要在任何地方进行一些调整吗?

控制器(作为@NickSdot 的答案):

/**
 * Store a newly created resource in storage.
 *
 * @param StoreFruitRequest $request
 * @return JsonResponse
 */
public function store(StoreFruitRequest $request)
{
    return response()->json(Fruit::create($request->all()) ?? "Cannot create fruit $request->name");
}

【问题讨论】:

  • 控制器看起来如何?
  • gte:field 验证的字段必须大于或等于给定的字段。但是你传递的是 0,这不是一个字段。我认为你应该使用 min:0 规则,它接受一个值 laravel.com/docs/9.x/validation#rule-min
  • 我试着改变gte:0分钟:0结果是一样的——消息没有被使用。

标签: laravel validation request message


【解决方案1】:

您可以在 Middleware 文件夹中添加一个名为 ForceJsonResponse.php 的中间件,然后将其添加到 $middleware 变量内的 Kernel.php 中。

ForceJsonResponse.php

use Closure;
use IlluminateHttpRequest;

class ForceJsonResponse
{
    /**
     * Handle an incoming request.
     *
     * @param  IlluminateHttpRequest  $request
     * @param  Closure(IlluminateHttpRequest): (IlluminateHttpResponse|IlluminateHttpRedirectResponse)  $next
     * @return IlluminateHttpResponse|IlluminateHttpRedirectResponse
     */
    public function handle(Request $request, Closure $next)
    {
        $request->headers->set('Accept', 'application/json');
        return $next($request);
    }
}

内核.php

protected $middleware = [
   //your other classes
   AppHttpMiddlewareForceJsonResponse::class,
];

【讨论】:

    猜你喜欢
    • 2015-05-08
    • 2018-03-01
    • 1970-01-01
    • 2015-07-02
    • 2020-10-08
    • 2020-09-08
    • 1970-01-01
    • 2023-03-16
    • 2020-06-30
    相关资源
    最近更新 更多