关于laravel使用自定义验证规则后某些规则不生效

版本信息

laravel:8.83.24
php:8.1.3

遇到的问题

在我使用自定义验证规则后,除了验证规则 required 正常生效以外,其他的都不正常生效
比如:numeric,integer,exists 等规则 ,毫不生效。

发此博文的需求

大佬们,有没有好的办法
自定义验证规则 And 自带的验证规则同时使用

使用自定义验证规则

1.在使用自定义规则之后
关于laravel使用自定义验证规则后某些规则不生效
并没出现我上一张图中的message方法定义的错误信息,但是如图中的解释是因为我在模型使用了 firstOrFail 语句 并且 全局异常处理添加过该异常
关于laravel使用自定义验证规则后某些规则不生效

不使用自定义验证规则

在不使用自定义规则的情况下
关于laravel使用自定义验证规则后某些规则不生效
1.首先会验证当前ID是否是一个数字类型
关于laravel使用自定义验证规则后某些规则不生效
2.其次会验证当前ID是否在数据库存在
关于laravel使用自定义验证规则后某些规则不生效

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 6

我尝试了一下,发现按照文档来,是没有错的。 我这边和你的区别在于我没有往自定义验证规则里面传递参数。

我不确定 自定义验证规则 里面能否传递参数,文档上没有说明不能传递,但是也没有说明可以传递。


你的是这样的

$request->validate(
            [
                'id' => ['required','numeric','exists:users,id',new TestRule($request->user)]
            ],
            $request->all()
        );

我的相关文件内容如下

routes/api.php

Route::prefix('v1')->name('api.v1.')->group(function(){
    Route::get('/aaa',[TestController::class,'index']);
});

App\Http\Controllers\TestController.php

.
.
class TestController extends Controller
{

    public function index(Request $request, User $user){
        // dd($user->name);
        $request->validate(
            [
                'id' => ['required','numeric','exists:users,id',new TestRule]
            ],
            $request->all()
        );
    }
}

App\Rules\TestRule.php

<?php

namespace App\Rules;

use App\Models\User;
use Illuminate\Contracts\Validation\Rule;
use Illuminate\Contracts\Validation\DataAwareRule;

class TestRule implements Rule
{
    public function passes($attribute, $value)
    {
        return strtoupper($value) !== $value;
    }

    public function message()
    {
        return trans('validation.uppercase');
        // return 'The validation error message.';
    }
}

我请求API得到的结果如下图,四个规则都生效了

file


我这里有个疑惑,你将user值传递到rule里面的目的是啥?

我一般传递过来的数据直接在 表单验证里面去验证的。我感觉 Laravel 的可用的验证规则 是足够的

1年前 评论

@sinmu 大佬 确实按你说的那种不传参数跑了一遍,跟你的一样的,也是没有错误,我给自定义规则传参数的意义就是给在内部 我会检查这个作品是不是本次请求的用户的作品 ,在这里 我也想到了可以 用 auth

1年前 评论
sinmu 1年前

@sinmu 大佬 我测试了一下,只要在rule中存在数据库操作就会暂停除了required以外的一切验证信息

1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!