контроллере.
Выше был вопросы/обсуждения по гидратору, но там не смог до конца выловить ответ.
Допустим на контроллер влетает JSON-пачка кривых данных.
{"name": 78, "age": "very old"}
Эти данные должны попасть в объект, который будет дальше передана на валидацию (и затем в сервисный слой).
class Person
{
public function __construct(
#[Required]
#[Length(min: 2)]
public string $name;
#[Number(min: 21)]
public int $age;
) {
}
}
Проблема в том, что код упадёт с TypeError ещё на этапе попытки присвоения данных (из-за несоответствия типов). И до валидатора не доедет. Получается нужно писать отдельный обработчики для ошибок валидации и TypeError.
Как только мы не изощрялись, чтобы обойти это: и валидировать входной массив до присвоения, и заводить отдельный нетипизированный объект для валидации, потом перекладывать в типизированный. И просто перехватывать TypeError на этапе населения, конвертировать в исключение валидации. Везде свои нюансы, неудобные и не всегда очевидные.
Решение: Нужно что-то типа гидратора, который населяет объект данными, которыми может (сверяет типы через рефлексию). Валидирует данные в объекте и объединяет результат с ошибками, которые в объект не попали.
Вопрос: Прежде чем самому писать свой велосипед, хотелось бы узнать. Есть какие-то готовые решения-либы для этого? Может Yii Validator что-то похожее умеет? Или это вообще по-другому решается как-то. Буду сильно благодарен за советы.
https://t.me/yii3ru/83938 - вот это оно по идеи
Обсуждают сегодня