Как валидировать данные в Laravel на основе других данных?

В Laravel для валидации данных на основе других данных можно использовать механизм правил валидации и условные правила. Позволяют они определить кастомные правила валидации и проверять значения полей на основе значений других полей.

Для начала, давайте определим кастомное правило валидации, которое будет основываться на других данных. В Laravel это делается путем создания нового класса правила в папке app/Rules. Например, создадим класс CheckOtherDataRule:

<?php

namespace AppRules;

use IlluminateContractsValidationRule;

class CheckOtherDataRule implements Rule
{
    protected $otherField;

    public function __construct($otherField)
    {
        $this->otherField = $otherField;
    }

    public function passes($attribute, $value)
    {
        // Реализация вашей логики проверки на основе других данных
        $otherValue = request()->input($this->otherField);

        // возвращаем результат проверки
        return $value == $otherValue;
    }

    public function message()
    {
        return 'Значение поля :attribute должно быть равно значению поля ' . $this->otherField;
    }
}

В данном примере класс CheckOtherDataRule реализует интерфейс Rule и содержит методы passes, message и конструктор. Метод passes выполняет проверку на основе других данных, а метод message задает сообщение, которое будет выводиться при неудачной валидации.

После создания класса правила, мы можем использовать его в правилах валидации для полей. Например, предположим, что у нас есть форма с двумя полями password и confirm_password, и мы хотим проверить, чтобы значение поля password было равно значению поля confirm_password. Мы можем определить такие правила валидации:

$rules = [
    'password' => ['required', 'string', new CheckOtherDataRule('confirm_password')],
    'confirm_password' => ['required', 'string']
];

$validator = Validator::make($data, $rules);

if ($validator->fails()) {
    // обработка ошибок валидации
}

В данном примере мы определяем правило валидации CheckOtherDataRule для поля password и указываем, что оно должно принимать значение из поля confirm_password.

Таким образом, мы использовали механизм кастомных правил валидации Laravel и условные правила, чтобы валидировать данные на основе других данных. Это позволяет нам гибко контролировать и проверять значения полей в форме.