Можно ли проводить валидацию объектов DTO без использования моделей данных?

Какие альтернативы существуют для валидации DTO в Yii2, помимо использования `rules` и расширения класса DTO `Model`? Например, существуют ли другие библиотеки или подходы?
  • 23 ноября 2023 г. 11:09
Ответы на вопрос 1
В Yii2 есть несколько альтернативных подходов к валидации DTO без использования моделей данных и расширения класса DTO `Model`, таких как:

1. Inline-валидация: Вы можете валидировать свойства объекта DTO в контроллере или сервисе, используя методы валидации Yii2, такие как `validateEmail()` или `validateNumeric()`. Например:

```php
use yii\base\InvalidArgumentException;
use yii\validators\EmailValidator;

public function actionCreate()
{
    $dto = new MyDto();
    $dto->email = 'invalid_email';
    
    $validator = new EmailValidator();
    if (!$validator->validate($dto->email, $error)) {
        throw new InvalidArgumentException($error);
    }
    
    // остальная логика
}
```

2.     Валидация с использованием специализированных классов: Yii2 предоставляет несколько специализированных классов валидации, которые можно использовать без моделей данных и расширения класса DTO `Model`. Например, вы можете использовать класс `yii\validators\DateValidator` для валидации даты и времени, или класс `yii\validators\StringValidator` для валидации строковых значений. Например:

```php
use yii\base\InvalidArgumentException;
use yii\validators\StringValidator;

public function actionCreate()
{
    $dto = new MyDto();
    $dto->name = null;
    
    $validator = new StringValidator();
    if (!$validator->validate($dto->name, $error)) {
        throw new InvalidArgumentException($error);
    }
    
    // остальная логика
}
```

3.     Использование сторонних библиотек: Вы также можете использовать сторонние библиотеки валидации, такие как `Respect\Validation` или `Symfony\Validator`, которые предоставляют более разнообразные возможности валидации DTO. Например, для использования библиотеки `Respect\Validation` в Yii2, вам нужно установить пакет с помощью Composer и использовать его в своих классах DTO. Пример использования:

```php
use yii\base\InvalidArgumentException;
use Respect\Validation\Validator as v;

public function actionCreate()
{
    $dto = new MyDto();
    $dto->age = 10;
    
    $validator = v::int()->min(18);
    if (!$validator->validate($dto->age)) {
        throw new InvalidArgumentException('Age must be at least 18.');
    }
    
    // остальная логика
}
```
Похожие вопросы