Laravel验证或

Ian*_*Ian 4 php laravel laravel-5 laravel-validation laravel-5.1

我有一些验证需要一个url 路由,但不是两个.

    $this->validate($request, [
        'name'  =>  'required|max:255',
        'url'   =>  'required_without_all:route|url',
        'route' =>  'required_without_all:url|route',
        'parent_items'=>  'sometimes|required|integer'
    ]);
Run Code Online (Sandbox Code Playgroud)

我尝试过使用required_without,required_without_all但他们都通过验证,我不知道为什么.

route是该route领域的一项规则

Sai*_*nce 9

我想你正在寻找required_if:

如果anotherfield字段等于任何值,则必须存在验证字段.

因此,验证规则是:

$this->validate($request, [
    'name'        =>  'required|max:255',
    'url'         =>  'required_if:route,""',
    'route'       =>  'required_if:url,""',
    'parent_items'=>  'sometimes|required|integer'
]);
Run Code Online (Sandbox Code Playgroud)

  • 好吧,他们可以删除该属性,它仍将通过服务器端,jQuery不是**服务器端问题的解决方案 (7认同)

xAo*_*Aoc 5

我认为最简单的方法是创建自己的验证规则。它可能看起来像。

Validator::extend('empty_if', function($attribute, $value, $parameters, Illuminate\Validation\Validator $validator) {

    $fields = $validator->getData(); //data passed to your validator

    foreach($parameters as $param) {
        $excludeValue = array_get($fields, $param, false);

        if($excludeValue) { //if exclude value is present validation not passed
            return false;
        }
    }

    return true;
});
Run Code Online (Sandbox Code Playgroud)

并使用它

    $this->validate($request, [
    'name'  =>  'required|max:255',
    'url'   =>  'empty_if:route|url',
    'route' =>  'empty_if:url|route',
    'parent_items'=>  'sometimes|required|integer'
]);
Run Code Online (Sandbox Code Playgroud)

PS 不要忘记在您的提供商中注册。

编辑

添加自定义消息

1) 添加消息 2) 添加替换者

Validator::replacer('empty_if', function($message, $attribute, $rule, $parameters){
    $replace = [$attribute, $parameters[0]];
    //message is: The field :attribute cannot be filled if :other is also filled
    return  str_replace([':attribute', ':other'], $replace, $message);
});
Run Code Online (Sandbox Code Playgroud)