KpValidationException - это исключение для ошибок валидации данных Kinopoisk API. Выбрасывается при обнаружении некорректных или недостающих данных в параметрах запросов к API или при валидации ответов от сервера.
// Некорректный ID фильмаif ($filmId <= 0) { throw new KpValidationException('ID фильма должен быть положительным числом');}// Неверный формат датыif (!preg_match('/^\d{4}-\d{2}-\d{2}$/', $date)) { throw new KpValidationException('Неверный формат даты: ожидается YYYY-MM-DD');}// Пустое обязательное полеif (empty($requiredField)) { throw new KpValidationException('Обязательное поле не может быть пустым');}
// Отсутствует обязательное поле в ответеif (!array_key_exists('items', $response)) { throw new KpValidationException('Отсутствует обязательное поле "items" в данных API');}// Неверный тип данныхif (!is_array($response['items'])) { throw new KpValidationException('Поле "items" должно быть массивом');}// Некорректная структура данныхif ($response['total'] < 0) { throw new KpValidationException('Поле "total" должно быть неотрицательным целым числом');}
// Класс не существуетif (!class_exists($className)) { throw new KpValidationException("Указанный класс не существует: {$className}");}// Метод не найденif (!method_exists($className, 'fromArray')) { throw new KpValidationException("Класс {$className} не имеет статического метода fromArray");}// Метод не статический$reflection = new \ReflectionMethod($className, 'fromArray');if (!$reflection->isStatic()) { throw new KpValidationException("Метод fromArray в классе {$className} должен быть статическим");}
use NotKinopoisk\Exception\KpValidationException;try { // Некорректный ID фильма $client->films->getById(-1);} catch (KpValidationException $e) { echo "Ошибка валидации: " . $e->getMessage(); // Выведет: "Ошибка валидации: ID фильма должен быть положительным числом"}
use NotKinopoisk\Exception\KpValidationException;// Простое исключениеthrow new KpValidationException('Неверный формат даты: ожидается YYYY-MM-DD');// Исключение с кодом ошибкиthrow new KpValidationException('ID фильма не может быть отрицательным', 400);// Исключение с предыдущим исключениемtry { $data = json_decode($jsonString, true); if (json_last_error() !== JSON_ERROR_NONE) { throw new \JsonException('Ошибка парсинга JSON'); }} catch (\JsonException $e) { throw new KpValidationException('Некорректный формат данных', 0, $e);}
use NotKinopoisk\Exception\KpValidationException;use NotKinopoisk\Services\FilmService;class FilmService extends AbstractService{ public function getById(int $filmId): Film { // Валидация входных данных if ($filmId <= 0) { throw new KpValidationException('ID фильма должен быть положительным числом'); } // Выполнение запроса $response = $this->client->get("/api/v1/films/{$filmId}"); // Валидация ответа if (!isset($response['kinopoiskId'])) { throw new KpValidationException('Некорректная структура ответа API'); } return Film::fromArray($response); }}
use NotKinopoisk\Exception\KpValidationException;use NotKinopoisk\Models\Film;class Film{ public static function fromArray(array $data): self { // Валидация обязательных полей if (!isset($data['kinopoiskId'])) { throw new KpValidationException('Отсутствует обязательное поле "kinopoiskId"'); } if (!is_int($data['kinopoiskId']) || $data['kinopoiskId'] <= 0) { throw new KpValidationException('Поле "kinopoiskId" должно быть положительным целым числом'); } // Создание объекта return new self( kinopoiskId: $data['kinopoiskId'], nameRu: $data['nameRu'] ?? null, nameEn: $data['nameEn'] ?? null ); }}
use NotKinopoisk\Exception\KpValidationException;use NotKinopoisk\Responses\DefaultResponse;class DefaultResponse{ public static function fromArray(array $data, string $cls): self { // Валидация структуры данных if (!array_key_exists('items', $data)) { throw new KpValidationException('Отсутствует обязательное поле "items" в данных API'); } if (!is_array($data['items'])) { throw new KpValidationException('Поле "items" должно быть массивом'); } // Валидация целевого класса if (!class_exists($cls)) { throw new KpValidationException("Указанный класс не существует: {$cls}"); } if (!method_exists($cls, 'fromArray')) { throw new KpValidationException("Класс {$cls} не имеет статического метода fromArray"); } // Создание ответа $items = array_map( static fn (array $itemData): object => $cls::fromArray($itemData), $data['items'] ); return new self( total: $data['total'] ?? count($items), items: $items ); }}
// Плохоthrow new KpValidationException('Ошибка');// Хорошоthrow new KpValidationException('ID фильма должен быть положительным числом, получено: ' . $filmId);
public function search(string $query, array $filters = []): SearchResponse{ // Валидация входных данных в начале метода if (empty(trim($query))) { throw new KpValidationException('Поисковый запрос не может быть пустым'); } if (strlen($query) < 2) { throw new KpValidationException('Поисковый запрос должен содержать минимум 2 символа'); } // Выполнение логики return $this->performSearch($query, $filters);}
public function validateFilmData(array $data): void{ if (!isset($data['kinopoiskId'])) { throw new KpValidationException('Отсутствует обязательное поле "kinopoiskId"'); } if (!is_int($data['kinopoiskId'])) { throw new KpValidationException('Поле "kinopoiskId" должно быть целым числом'); } if ($data['kinopoiskId'] <= 0) { throw new KpValidationException('Поле "kinopoiskId" должно быть положительным числом'); }}