Пользовательское правило проверки Laravel, ссылающееся на другие параметры запроса - PullRequest
0 голосов
/ 21 октября 2019

Я пытаюсь создать собственное правило проверки, которое принимает параметр, но этот параметр является именем другого поля в запросе, как для правила required_with.

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

В настоящее время я создаю свой класс правил как

class MyClassRule
{
    public function validate($attribute, $value, $parameters, $validator) : bool
    {
        // do some stuff here to return true/false
    }
}

и регистрирую его в моемпоставщик услуг с

Validator::extend('my_rule', 'path\to\MyClassRule@validate');

, поэтому я могу использовать его в своем запросе как

public function rules()
{
    return [
        'field' => ['my_rule'],
    ];
}

. Я хотел бы иметь возможность

public function rules()
{
    return [
        'other_field' => [...],
        'field'       => ['my_rule:other_rule'],
    ];
}

ииспользуйте значение other_field в моем классе правил, но значение $parameters validate() равно ['other_field']. т.е. массив, содержащий другое имя поля, а не его значение.

Как я могу это сделать?

Ответы [ 2 ]

0 голосов
/ 21 октября 2019

Команда ремесленника

php artisan make:rule ValidateOtherField

Класс ValidateOtherField

class ValidateOtherField implements Rule
{
        private $error = '';
        public function passes($attribute, $value)
        {
            if(request()->has('field') && request()->get('field') === 'MyValueSuccess'){
                if(is_string($value)){
                    return true;
                } else {
                    $this->error = '- not valid field';
                }
            }
            return false;
        }
        public function message()
        {
            return "Error :attribute {$this->error}";
        }
 }

rules

public function rules()
{
    return [
        'field'       => ['string'], //Validate field
        'other_field' => [new ValidateOtherField],        
    ];
}
0 голосов
/ 21 октября 2019

Поскольку $validator является полным экземпляром используемого объекта Validator, мы можем извлечь из него данные, используя getData():

public function validate($attribute, $value, $parameters, $validator)
{
    // You may want to check to make sure this exists first.
    $otherField = $parameters[0];

    $otherValue = data_get($validator->getData(), $otherField);

    // @todo Validate $otherValue
}

Использование data_get() позволяет использовать точечную записьдля значений вложенного массива.

...