关于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 协议》,转载必须注明作者和本文链接
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 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 的可用的验证规则 是足够的

2年前 评论

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

2年前 评论
sinmu 2年前

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

2年前 评论

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