Laravel 自定义验证规则

Posted

技术标签:

【中文标题】Laravel 自定义验证规则【英文标题】:Laravel custom validation rule 【发布时间】:2017-04-11 17:20:57 【问题描述】:

如何为一个输入值必须是整数并以 120 开头的输入制定自定义验证规则? 我已经阅读了有关制作自定义消息的信息,但不了解规则。 我想使用正则表达式来验证数据。 ^120\d11$ 这是我的正则表达式。 我是 Laravel 的新手,这就是为什么现在无法想象如何做到这一点。

$this->validate($request, []); 中使用它的自定义验证

现在我正在验证这样的数据:

$this->validate($request, [
    'user_id' => 'integer|required',
    'buy_date' => 'date',
    'guarantee' => 'required|unique:client_devices|number',
    'sn_imei' => 'required|unique:client_devices',
    'type_id' => 'integer|required',
    'brand_id' => 'integer|required',
    'model' => 'required'
]);

我要添加自定义验证的输入是guarantee

【问题讨论】:

【参考方案1】:

从 Laravel 5.5 开始,您可以直接在 request 对象上进行验证。

public function store(Request $request)

    $request->validate([
        'guarantee' => 'regex:/^120\d11$/'
    ]);

【讨论】:

【参考方案2】:

最快最简洁的方法是在控制器操作中添加inline validator:

public function store(Request $request)


    $validator = Validator::make($request->all(), [
        'number' => [
            'regex' => '/^120\d11$/'
        ],
    ]);

    if ($validator->fails()) 
        return redirect('post/create')
            ->withErrors($validator)
            ->withInput();
    

    return view('welcome');

其中number 是请求中提交的字段的name

如果您有很多验证工作要做,您可能需要考虑改用Form Request,作为整合大量验证逻辑的一种方式。

【讨论】:

Method [validate/^120\d11$/] does not exist. 我收到错误消息 :( 我也在使用'required|unique:client_devices|number'这个输入。 'guarantee' => [ 'required', 'unique:client_devices', 'regex:/^120\d11$/', ], 终于找到我需要的了)【参考方案3】:

您可以在控制器中创建自定义验证:

$name = Input::get('field-name')

$infoValidation = Validator::make( 
                    array( // Input array
                        'name'  => $name,

                    ),
                    array( // rules array
                        'name'  => array("regex:/^120\d11$"),
                    ),

                    array( // Custom messages array
                        'name.regex' => 'Your message here',
                    )
                ); // End of validation

                $error = array();
                if ($infoValidation->fails())
                
                    $errors =  $infoValidation->errors()->toArray();
                    if(count($errors) > 0)
                    
                        if(isset($errors['name']))
                            $response['errCode'] = 1;
                            $response['errMsg']  = $errors['name'][0];
                        

                    
                    return response()->json(['errMsg'=>$response['errMsg'],'errCode'=>$response['errCode']]);
                

希望这会有所帮助。

【讨论】:

Validator::make() 之后我可以在$this->validate($request, []); 中使用它吗?

以上是关于Laravel 自定义验证规则的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5.5 / 验证器 / 自定义规则

自定义 Laravel 验证规则示例

为自定义验证规则命名 - Laravel 8

Laravel 验证:存在附加列条件 - 自定义验证规则

在 Laravel 5 中使用表单请求验证时如何添加自定义验证规则

具有多个参数的 Laravel 自定义验证规则 [重复]