Laravel проверка формы: то же, что поле a или b - PullRequest
0 голосов
/ 29 февраля 2020

У меня есть 3 поля: игрок1, игрок2 и победитель. Я хочу проверить, что победитель равен player1 или player 2.

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

Ответы [ 2 ]

0 голосов
/ 02 марта 2020

На самом деле это правило должно быть зарегистрировано в exteDependent для правильного разрешения имен параметров при использовании с массивами. Конечный код:

class OneOfRule
{

    public function validate($attribute, $value, $parameters, $validator) {

        if(is_null($value)) return true;

        foreach($parameters as $param) {
            $other = Arr::get($validator->getData(), $param);
            if ($value === $other) {
                return true;
            }
        }
        return false;
    }

}

public function boot()
    {
        Validator::extendDependent('one_of', 'App\Http\Validation\Rules\OneOfRule@validate');
    }
0 голосов
/ 29 февраля 2020

Вы можете использовать пользовательское правило проверки для этого. Там нет ничего встроенного, что позволяет сравнивать с одной из многих других областей. Ближайшая проверка - same, но она проверяет только одно другое поле.

(я добавил dd() для выгрузки данных, вы можете удалить их)

$values будет то, что исходит от вашего ввода. $validationRules можно настроить для ваших нужд.


        Validator::extend('equals_one_of', function($attribute, $value, $parameters, \Illuminate\Validation\Validator $validator) {
            $fields = $validator->getData(); // all posted values

            foreach($parameters as $param) { // this is each of the comma separated fields in the validationRules array
                if ($value == $fields[$param]) {
                    dd("matched");
                    return true;
                }
            }
            dd("no match");
            return false;
        });

        $values = [
            'player1' => 'test1',
            'player2' => 'test2',
            'winner' => 'test1'
        ];

        $validationRules = [
            'player1' => 'required',
            'player2' => 'required',
            'winner' => 'required|equals_one_of:player1,player2'
        ];

        $validate = Validator::make($values, $validationRules);
        // use your validator as normal.
        dd($validate->validate());

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...