Laravel自定义验证顺序

时间:2019-10-16 11:57:46

标签: laravel laravel-5 laravel-validation

我添加了自定义验证规则

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函数内部出现错误

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

2 个答案:

答案 0 :(得分:1)

documentation中可以找到以下内容:

  

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

意思是代码按预期工作。 您可能正在寻找bail选项:

  

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

这意味着您应该尝试以下操作:

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

答案 1 :(得分:0)

自定义扩展验证规则首先运行,因为它可能是在针对每个请求运行的服务提供商的启动功能中定义的,因此您需要捕获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;
        }
    });
}

现在,如果碳无法按照所传递的格式创建,它将抛出一个异常,我们捕获,记录并返回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的验证错误消息

enter image description here

希望这会有所帮助