Валидация DTO без Model?

Вопрос касается валидации DTO (Data Transfer Object) без использования моделей в фреймворке Yii.

DTO используется для передачи данных между различными слоями приложения или веб-сервисами. Основная цель DTO - быть независимым от сложности и структуры входящих данных, что делает его более удобным для работы с внешними сервисами или API.

В фреймворке Yii, по умолчанию, валидация данных происходит внутри моделей. Однако, если вы хотите осуществить валидацию DTO без использования моделей, есть несколько способов это сделать.

1. Создание валидаторов на уровне DTO:
Самый простой способ - добавить методы валидации в сам класс DTO. В этих методах можно проверять данные и добавлять ошибки, если они не прошли валидацию. Например:

class MyDto {
    public $name;
    public $email;
    
    public function validate() {
        if (empty($this->name)) {
            $this->addError('name', 'Name is required');
        }
        
        if (!filter_var($this->email, FILTER_VALIDATE_EMAIL)) {
            $this->addError('email', 'Invalid email format');
        }
    }
    
    public function addError($attribute, $message) {
        // добавить ошибку в массив ошибок или выполнять необходимые действия
    }
}

2. Использование Yii-компонента валидации:
Yii предоставляет компонент CValidator, который можно использовать для валидации данных вне контекста моделей. Например:

$validator = new CEmailValidator;
$email = '[email protected]';

if (!$validator->validateValue($email)) {
    // обработка ошибок, если валидация не прошла
}

3. Создание отдельного сервиса валидации:
Вы можете создать отдельный сервис, который будет отвечать за валидацию DTO. В этом сервисе вы можете определить и настроить различные правила и способы валидации. Например:

class MyDtoValidator {
    public function validate(MyDto $dto) {
        if (empty($dto->name)) {
            return 'Name is required';
        }
        
        if (!filter_var($dto->email, FILTER_VALIDATE_EMAIL)) {
            return 'Invalid email format';
        }
        
        return true;
    }
}

Пример использования:

$myDto = new MyDto();
$myDto->name = "John Doe";
$myDto->email = "invalid_email";

$validator = new MyDtoValidator();
$result = $validator->validate($myDto);

if ($result !== true) {
    // обработка ошибок
}

В итоге, выбор метода валидации DTO без использования моделей зависит от сложности вашего приложения, его требований и предпочтений. Каждый из предложенных методов имеет свои преимущества и недостатки, и при решении следует учесть контекст вашего проекта.