【问题标题】:How can I conditionally validate a custom rule in Laravel?如何有条件地验证 Laravel 中的自定义规则?
【发布时间】:2020-03-19 21:34:01
【问题描述】:

在我的控制器中,我有一个 store 方法来验证请求数据:

$request->validate([
    'title' => 'required',
    'description' => 'required',
    'date' => [
        'required',
        new DateFormatRule
    ],
    'closed' => 'nullable',
    'time_start' => 'required_if:closed,0',
    'time_end' => [
        'required_if:closed,0',
        new TimeDurationRule($request->time_start)
    ],
]);

closed 是一个布尔值。如果closed 为假,则time_starttime_end 字段是必需的。这似乎按预期工作。

但是,如果我以 closed 为 true 提交请求,我就会陷入我的自定义 TimeDurationRule

'time_end' => [
    'required_if:closed,0',
    new TimeDurationRule($request->time_start)
], 

如何使new TimeDurationRule($request->time_start) 成为有条件的?例如,如果closed 为真,我手动将time_end 设置为null,因此time_start/time_end 不需要值(不是必需的)。

如果我将自定义排除注释掉,一切都会按预期进行。

感谢您的任何建议!

【问题讨论】:

    标签: php laravel web-frameworks laravel-validation laravel-7


    【解决方案1】:

    您可以将$request->closed 传递给您的TimeDurationRule,然后在rulepasses 方法中,您可以执行以下操作:

    class TimeDurationRule implements Rule
    {
        public $closed;
    
        public function __construct(/*all needed parameters*/, $closed)
        {
            $this->closed = $closed;
        }
    
        public function passes($attribute, $value)
        {
            if(!$closed){ 
             return true
            }
    
            // the rest of validation logic
        }
    }
    

    然后

    new TimeDurationRule(/*all needed parameters*/, $request->closed)
    

    您也可以在此处阅读更多信息:https://laracasts.com/discuss/channels/laravel/create-custom-validation-rule-with-additional-parameters-implement-in-request

    希望对你有帮助!

    【讨论】:

    • 我觉得自己很傻。我没有意识到我可以将额外的参数传递给这样的规则。认为这只是一个只评估一个论点的 1:1 规则。感谢您的帮助!
    • @Damon 没问题! Rule 与其他所有类一样,只是一个类,因此您可以使用构造函数和类似方法做任何您想做的事情。
    猜你喜欢
    • 2017-12-01
    • 2017-04-11
    • 2018-02-18
    • 2014-11-25
    • 2019-02-12
    • 2016-11-22
    • 2018-03-15
    • 2015-01-26
    • 2016-01-13
    相关资源
    最近更新 更多