Проверка Laravel ИЛИ

У меня есть некоторая проверка, которая требует наличия 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'
    ]);

Я пытался использовать required_without и required_without_all, однако они оба прошли проверку, и я не знаю, почему.

route — правило в поле route


person Ian    schedule 21.01.2016    source источник
comment
Я только что попробовал использовать required_without, и это работает. Можете ли вы опубликовать свое правило route? return ['route' => "required_without:url", 'url' => "required_without:route|url"]; Работает так, как я ожидал.   -  person Ben Swinburne    schedule 21.01.2016
comment
@BenSwinburne Смотрите ответ ниже и мой комментарий, требуется совершенно неправильно :)   -  person Ian    schedule 21.01.2016


Ответы (2)


Я думаю, что самым простым способом было бы создать собственное правило проверки. Может похоже.

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;
});

И использовать его

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

P.S. Не забудьте зарегистрировать это у своего провайдера.

Изменить

Добавить собственное сообщение

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);
});
person xAoc    schedule 21.01.2016
comment
Идеальный! Сегодня утром я понял, что required_if — это совсем не то, что мне нужно, и на самом деле оно проверяет, не пусто ли поле другое, благодарю вас за помощь. - person Ian; 21.01.2016
comment
Существует небольшая проблема с правилом, касающимся сообщений, поскольку оно является настраиваемым правилом проверки, оно не выполняет одинаковых замен в сообщениях, и если я просто установлю его как статическое сообщение, оно будет отображаться дважды из-за обоих полей используя ту же роль, сможете ли вы расширить свой ответ, включив в него сообщение? Например, The field :attribute cannot be filled if :other is also filled"? ближайший метод, который я нашел, находится в \vendor\laravel\framework\src\Illuminate\Validation\Validator.php строке 1680. - person Ian; 21.01.2016
comment
идеально еще раз! Я думал, что это может иметь какое-то отношение к 3-му параметру $this->validate(), но нет, спасибо! :) - person Ian; 21.01.2016

Я думаю, вы ищете required_if:

Проверяемое поле должно присутствовать, если поле anotherfield равно любому значению.

Итак, правило проверки будет таким:

$this->validate($request, [
    'name'        =>  'required|max:255',
    'url'         =>  'required_if:route,""',
    'route'       =>  'required_if:url,""',
    'parent_items'=>  'sometimes|required|integer'
]);
person Saiyan Prince    schedule 21.01.2016
comment
К сожалению, это не помогает, проверка все еще проходит, когда оба поля заполнены - person Ian; 21.01.2016
comment
@Ian Просто мысль: почему бы тебе не использовать jQuery? Например, если пользователь заполняет поле url, добавьте атрибут readonly в поле route и наоборот. Таким образом, они НЕ смогут заполнить данные, если одно из полей заполнено. - person Saiyan Prince; 21.01.2016
comment
Ну, они могут просто удалить этот атрибут, и он все равно будет проходить через сервер, jQuery не является решением проблемы на стороне сервера. - person Ian; 21.01.2016