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

Posted

技术标签:

【中文标题】Laravel 5.5 / 验证器 / 自定义规则【英文标题】:Laravel 5.5 / Validator / Custom rules 【发布时间】:2018-05-25 00:15:34 【问题描述】:

(为了更清晰的目的而编辑)

几个月前我发现了 Laravel,并关注了一些 Laracast 视频。现在,我遇到了自定义验证器的问题。

我有正常和永久的规则(日期 | 要求 | 最小/最大)来验证我的表单请求。这部分有效。

但我有一个自定义验证,如果请求参数之一 - select1 - 设置为 1(例如),则可以将其验证为正常规则。

我看了十几个解释,但都不够清楚。

那么,让我们从我的代码开始吧。谢谢你的宽容... 我的问题是底部的 customTest 函数。

谢谢,

1/ 我提出了一个新的请求

php artisan make:controller priceRequest.php

2/ 我制定了一些规则并更改了一些行。

public function authorize()

    return true;


// Permanent RULES
public function rules()

    $rules = [
        'field1' => 'required|min:1|max:15',
        'field2' => 'required',
        'date1' => 'required|date',
        'select1' => 'required',
    ];

    return $rules;

然后我集成了一个新功能来执行自定义验证

public function withValidator($validator) 
    $validator->after(function ($validator) 
        if (!$this->customTests($this->request->get('data')))
            $validator->errors()->add('custom', 'Something is wrong');
        
    );

最后,我写了 customTests 函数,我被困在这个函数里面了!!

public function customTests($data) 

    if ($data['select1'] == 1) 

        // HERE MY QUESTION
        // I'd like to verify that $data['date2']
        // is a date and is set. So, I'd like to
        // add a rule to rules (has I made with
        // 'date1' => 'required|date',
        // and return TRUE if the rule match or
        // FALSE

    

【问题讨论】:

问题是什么? 对不起,问题在代码中:-( 尝试用其他方式定义它。没有人知道你需要什么。 你好亚当,我想我已经够清楚了。关于问题 B,我想在规则函数中添加一个“正常”规则,而不是编写测试来检查日期。我不知道如何将此规则添加到验证器。我检查了: $v = Validator::make($data, [ 'email' => 'required|email', 'games' => 'required|numeric', ]);但我不知道在 $data 变量中传递什么。 required_if Laravel 5 validation的可能重复 【参考方案1】:

所以,我找到了解决问题的方法。

我犯了一个错误和困惑,因为我试图将新规则添加到 ->after() 函数中。

所以,正确的代码如下:

public function withValidator($validator)

    $validator->sometimes('ticket.price', 'required|integer|min:0.1', function ($input) 
    if ($any_condition_who_need_to_verify_new_rule) 
        return true;
    
    else 
        # Everything is perfect, this rule cas be omitted
    

    $validator->after(function ($validator) use ($ticket) 

        /* New test more complicated which cannot be
           tested with a rule */
        if ($this_test_is_complex_and_fails) 
            $validator->errors()->add('validateTicket', 'This is another problem');
            return false;
        
    );
    return $validator;

【讨论】:

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

Laravel 5.5 FormRequest 自定义表单请求验证类

Laravel 5.5 FormRequest 自定义错误消息

如何在 Laravel 5.5 中为选定的请求类设置自定义响应

laravel 5.5 修改注册表单验证规则

Laravel 5.5 对具有不同列名的单独表的唯一验证规则

Laravel - 在自定义验证中使用验证规则