【问题标题】:Laravel Custom Validation OrderLaravel 自定义验证订单
【发布时间】:2019-11-27 21:08:54
【问题描述】:

我添加了一个自定义验证规则

Validator::extend('validate_timezone', function($attribute, $value, $parameters, $validator) {
    $items = request('items');
    $from_date = Carbon::createFromFormat('Y-m-d H:i:s', $item['from_date']);
    // my code below depend on $from_date
    ......
    ......

    return true;
);

验证规则

 "from_date" => "required|date_format:Y-m-d H:i:s|validate_timezone",

问题,自定义验证validate_timezone'date_format:Y-m-d H:i:s'之前运行,所以如果日期格式错误,我会在validate_timezone函数内部报错

如何在自定义验证 validate_timezone 之前强制验证 date_format:Y-m-d H:i:s

【问题讨论】:

    标签: laravel laravel-5 laravel-validation


    【解决方案1】:

    documentation可以找到以下内容:

    规则将按照分配的顺序进行验证。

    表示代码按预期工作。 您可能正在寻找bail 选项:

    有时您可能希望在第一次验证失败后停止对属性运行验证规则。为此,请将bail 规则分配给属性

    这意味着你应该试试这个:

    "from_date" => "bail|required|date_format:Y-m-d H:i:s|validate_timezone",
    

    【讨论】:

    • validate_timezone 总是在'date_format:Y-m-d H:i:s' 之前运行
    • 不,它没有,但是即使'date_format:Y-m-d H:i:s'失败了,其他规则仍然会被调用,看看它们是否也失败了。
    • "from_date" => "bail|required|date_format:Y-m-d H:i:s|validate_timezone", 我试过了,不行
    • 你是对的,谢谢,'date_format:Y-m-d H:i:s'validate_timezone 之前运行,我得到了错误,因为在validate_timezone 中,我从请求中迭代所有项目并在 from_date 上进行处理,所以我想@ 987654332@ 首先运行,我收到错误,因为我在 validate_timezone 中使用尚未验证的值
    【解决方案2】:

    自定义扩展验证规则首先运行,因为它可能定义在服务提供者的启动函数中,该函数在每个请求上运行,因此您需要捕获 Carbon 异常并相应地返回 false

    public function boot()
    {
        \Validator::extend('validate_timezone', function ($attribute, $value, $parameters, $validator) {
            try {
                $from_date = Carbon::createFromFormat('Y-m-d H:i:s', $value);
                return true;
            } catch (Exception $ex) {
                logger()->warning($ex->getMessage());
                return false;
            }
        });
    }
    

    现在如果 carbon 不能从传递的格式创建,它会抛出一个异常,我们捕获、记录并返回 false

    正如@PtrTon 提到的,您需要在第一次验证失败时保释

    现在假设这样的验证逻辑

    Route::post('/', function () {
        $validate = request()->validate([
            "from_date" => "bail|required|date_format:Y-m-d H:i:s|validate_timezone",
        ]);
        dd($validate);
    });
    

    还有这样的视图形式

    <form action="/" method="post">
        @csrf
        <input type="datetime" name="from_date" value="2019-10-16 15:03">
        <button type="submit">Submit</button>
    </form>
    @if ($errors->any())
    <div class="alert alert-danger">
        <ul>
            @foreach ($errors->all() as $error)
            <li>{{ $error }}</li>
            @endforeach
        </ul>
    </div>
    @endif
    

    date_from 的值对 date_formatvalidate_timezone 均无效,但只会返回 date_format 的验证错误消息

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 2016-05-07
      • 1970-01-01
      • 2012-11-27
      • 2015-05-10
      • 1970-01-01
      • 1970-01-01
      • 2014-05-31
      • 2017-04-11
      • 2018-05-31
      相关资源
      最近更新 更多