获取方法的FromRequest验证不起作用-Laravel

iezvtpos  于 2023-06-25  发布在  其他
关注(0)|答案(3)|浏览(151)

我正在使用FormRequest类进行GET请求验证。规则似乎是正确的,但验证不起作用。
我的FormRequest类看起来像这样:

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class ShowTheSubjectRequest extends FormRequest
{
    public function authorize()
    {
        return true;
    }

    public function rules()
    {        
        return [
            'subject_code' => 'required|exists:the_subjects,sub_x',
        ];
    }

    public function messages()
    {
        return [
            'subject_code.required' => 'Required,Can\'t Be Empty',
            'subject_code.exists' => 'Entry does\'t exist with us.Choose Correct'
        ];
    }
{

我总是得到以下回应:

{
    "message": "The given data was invalid.",
    "errors": {
        "subject_code": [
            "Required,Can't Be Empty"
        ]
    }
}

我在某个地方读到FormRequest不适合GET方法。我还可以如何验证GET请求?

y0u0uwnf

y0u0uwnf1#

不能对GET请求使用表单验证,因为表单验证的是请求体,而GET请求没有请求体。要验证查询字符串(?之后的URL部分),需要使用一个中间件,该中间件在出现错误时会中止请求。

<?php

namespace App\Http\Middleware;

use Closure;

class ValidateSubjectCode
{
    public function handle($request, Closure $next)
    {
        $subjectCode = $request->route()->param('subject_code');

        //Your validation logic

        return $next($request);
    }
}

因为这种验证可能是特定于控制器的,所以您还可以在控制器__construct中定义一个Closure中间件

public function __construct()
    {
        $this->middleware(function ($request, $next) {
            $subjectCode = $request->route()->param('subject_code');

            //Your validation logic

            return $next($request);
    }
nwsw7zdq

nwsw7zdq2#

要在路由参数上定义简单的正则表达式验证规则,可以在web.php中的路由定义末尾使用where()方法,如下所示

Route::get('show/{subject_code}', [SubjectController::class, 'show'])
    ->name('subject.show')
    ->where(['subject_code' => '[0-9]+'])
ocebsuys

ocebsuys3#

一个简单的选择是只获取您想要验证的值并将它们合并到请求主体中。只需向FormRequest类添加一个prepareForValidation()方法即可。
这个问题并没有说明这个值是否是一个路由参数(例如https://example.com/api/v1/subject_code_goes_here/foo)或查询字符串项(例如https://example.com/api/v1/foo?subject_code=xxx .)
在route参数的情况下,它看起来像这样:

public function prepareForValidation(): void
{
    $this->merge([
        "subject_code" => $this->route()->parameter("subject_code");
    ]);
}

查询字符串项如下所示:

public function prepareForValidation(): void
{
    $this->merge([
        "subject_code" => $this->query()->get("subject_code");
    ]);
}

相关问题