diff --git a/docs/dev/kinopoiskdev/.nav.yml b/docs/dev/kinopoiskdev/.nav.yml index 402d578..4c7f984 100644 --- a/docs/dev/kinopoiskdev/.nav.yml +++ b/docs/dev/kinopoiskdev/.nav.yml @@ -1,6 +1,6 @@ title: KinopoiskDev PHP Wrapper nav: - - Главная: README.md + - "index.md" - Основной класс / клиент: Kinopoisk.md - Сравнение с KinopoiskUnofficialTech: notkinopoiskphp-compare.md - Атрибуты: Attributes/ diff --git a/docs/dev/kinopoiskdev/Attributes/.nav.yml b/docs/dev/kinopoiskdev/Attributes/.nav.yml index 5a99d26..e22ffa4 100644 --- a/docs/dev/kinopoiskdev/Attributes/.nav.yml +++ b/docs/dev/kinopoiskdev/Attributes/.nav.yml @@ -1,5 +1,6 @@ title: Атрибуты nav: + - "index.md" - "*" sort: type: alphabetical diff --git a/docs/dev/kinopoiskdev/Attributes/index.md b/docs/dev/kinopoiskdev/Attributes/index.md new file mode 100644 index 0000000..c3f44ee --- /dev/null +++ b/docs/dev/kinopoiskdev/Attributes/index.md @@ -0,0 +1,230 @@ +--- +title: Атрибуты +description: Система атрибутов KinopoiskDev для декларативной настройки моделей, валидации и конфигурации +keywords: атрибуты, validation, sensitive, apifield, php 8.3, декларативная валидация +category: attributes +tags: + - Kinopoisk + - attributes + - атрибуты +--- + +# Атрибуты + +Система атрибутов KinopoiskDev предоставляет декларативный способ настройки моделей, валидации и конфигурации через PHP 8.3+ атрибуты. + +## Обзор + +Атрибуты в KinopoiskDev используются для: + +- **Валидации данных** - автоматическая проверка входных параметров +- **Конфигурации API** - настройка маппинга полей +- **Безопасности** - контроль отображения конфиденциальных данных +- **Документации** - самодокументируемый код + +## Доступные атрибуты + +### Validation + +**Файл:** [Validation.md](Validation.md) + +Основной атрибут для валидации свойств моделей. Поддерживает различные типы проверок: + +```php +class Movie { + #[Validation(required: true, minLength: 1, maxLength: 255)] + public string $title; + + #[Validation(min: 1900, max: 2030)] + public int $year; + + #[Validation(pattern: '/^[a-zA-Z0-9\s]+$/')] + public string $genre; +} +``` + +**Возможности:** + +- Обязательные поля +- Ограничения длины строк +- Диапазоны числовых значений +- Регулярные выражения +- Допустимые значения +- Кастомные сообщения об ошибках + +### Sensitive + +**Файл:** [Sensitive.md](Sensitive.md) + +Атрибут для пометки конфиденциальных полей с контролем их отображения: + +```php +class ApiConfig { + #[Sensitive(hideInJson: true, hideInArray: true)] + public string $apiToken; + + #[Sensitive(hideInJson: true, hideInArray: false)] + public string $secretKey; +} +``` + +**Возможности:** + +- Скрытие в JSON сериализации +- Скрытие в массивах +- Гибкая настройка видимости +- Автоматическая защита данных + +### ApiField + +**Файл:** [ApiField.md](ApiField.md) + +Атрибут для настройки маппинга между свойствами модели и полями API: + +```php +class Movie { + #[ApiField(name: 'movie_title', nullable: false, default: 'Unknown')] + public string $title; + + #[ApiField(name: 'release_year', nullable: true)] + public ?int $year; +} +``` + +**Возможности:** + +- Кастомные имена полей API +- Настройка nullable значений +- Значения по умолчанию +- Гибкий маппинг данных + +## Использование + +### Базовый пример + +```php +title = ''; // Пустая строка + +try { + $validator->validate($movie); +} catch (ValidationException $e) { + echo $e->getFirstError(); // "Поле title обязательно" +} +``` + +### Автоматическая сериализация + +Атрибуты `#[Sensitive]` автоматически обрабатываются при сериализации: + +```php +$config = new ApiConfig(); +$config->apiToken = 'secret-token'; + +$json = json_encode($config); +// apiToken будет скрыт в JSON + +$array = $config->toArray(); +// apiToken будет скрыт в массиве (если hideInArray: true) +``` + +## Связанные разделы + +- **[ValidationService](../Services/ValidationService.md)** - сервис валидации +- **[ValidationException](../Exceptions/ValidationException.md)** - исключения валидации +- **[KinopoiskDevException](../Exceptions/KinopoiskDevException.md)** - базовые исключения + +## Преимущества + +### Декларативность + +```php +// Вместо ручной валидации +if (empty($title) || strlen($title) > 255) { + throw new Exception('Invalid title'); +} + +// Используйте атрибуты +#[Validation(required: true, maxLength: 255)] +public string $title; +``` + +### Безопасность + +```php +// Автоматическое скрытие конфиденциальных данных +#[Sensitive(hideInJson: true)] +public string $apiToken; +``` + +### Гибкость + +```php +// Легкая настройка маппинга API +#[ApiField(name: 'movie_title', nullable: false)] +public string $title; +``` + +## Полезные ссылки + +- **[PHP Attributes Documentation](https://www.php.net/manual/en/language.attributes.php)** - официальная документация PHP +- **[Validation Service](../Services/ValidationService.md)** - сервис валидации +- **[Exceptions](../Exceptions/)** - обработка ошибок + +--- + +**Атрибуты KinopoiskDev** - современный подход к декларативной настройке моделей с использованием возможностей PHP 8.3+. diff --git a/docs/dev/kinopoiskdev/Contracts/.nav.yml b/docs/dev/kinopoiskdev/Contracts/.nav.yml index 70fbf78..fc351ac 100644 --- a/docs/dev/kinopoiskdev/Contracts/.nav.yml +++ b/docs/dev/kinopoiskdev/Contracts/.nav.yml @@ -1,5 +1,6 @@ -title: Контракты +title: Интерфейсы nav: + - "index.md" - "*" sort: type: alphabetical diff --git a/docs/dev/kinopoiskdev/Contracts/index.md b/docs/dev/kinopoiskdev/Contracts/index.md new file mode 100644 index 0000000..2ab494b --- /dev/null +++ b/docs/dev/kinopoiskdev/Contracts/index.md @@ -0,0 +1,274 @@ +--- +title: Интерфейсы +description: Система контрактов KinopoiskDev для обеспечения совместимости и расширяемости библиотеки +keywords: интерфейсы, interfaces, psr, cache, logger, стандарты +category: contracts +tags: + - Kinopoisk + - interfaces + - контракты + - интерфейсы + - contracts +--- + +# Интерфейсы + +Система контрактов KinopoiskDev предоставляет интерфейсы для обеспечения совместимости и расширяемости библиотеки. Все интерфейсы основаны на PSR стандартах для максимальной совместимости с экосистемой PHP. + +## Обзор + +Интерфейсы в KinopoiskDev используются для: + +- **Стандартизации** - обеспечение единообразного интерфейса +- **Расширяемости** - возможность подключения сторонних реализаций +- **Тестирования** - легкая замена реальных сервисов на моки +- **PSR совместимости** - следование стандартам PHP-FIG + +## Доступные интерфейсы + +### CacheInterface + +**Файл:** [CacheInterface.md](CacheInterface.md) + +Интерфейс для сервиса кэширования, определяющий контракт для работы с различными системами кэширования: + +```php +interface CacheInterface { + public function get(string $key): mixed; + public function set(string $key, mixed $value, int $ttl): bool; + public function delete(string $key): bool; + public function has(string $key): bool; + public function clear(): bool; + public function getMultiple(array $keys): array; + public function setMultiple(array $values, int $ttl): bool; +} +``` + +**Возможности:** + +- Базовые операции CRUD для кэша +- Поддержка TTL (время жизни) +- Массовые операции (getMultiple, setMultiple) +- Проверка существования ключей +- Очистка всего кэша + +**Реализации:** + +- Встроенный CacheService +- Возможность подключения Redis, Memcached и других драйверов + +### LoggerInterface + +**Файл:** [LoggerInterface.md](LoggerInterface.md) + +PSR-3 совместимый интерфейс для логирования, основанный на стандартах PHP-FIG: + +```php +interface LoggerInterface { + public function debug(string $message, array $context = []): void; + public function info(string $message, array $context = []): void; + public function warning(string $message, array $context = []): void; + public function error(string $message, array $context = []): void; + public function critical(string $message, array $context = []): void; +} +``` + +**Возможности:** + +- PSR-3 совместимость +- Различные уровни логирования +- Контекстная информация +- Стандартизированный интерфейс + +**Реализации:** + +- Встроенный логгер +- Совместимость с Monolog, Psr\Log и другими PSR-3 логгерами + +## Использование + +### Подключение кастомного кэша + +```php +redis = $redis; + } + + public function get(string $key): mixed { + return $this->redis->get($key); + } + + public function set(string $key, mixed $value, int $ttl): bool { + return $this->redis->setex($key, $ttl, serialize($value)); + } + + // ... остальные методы +} + +// Использование с KinopoiskDev +$redis = new Redis(); +$redis->connect('127.0.0.1', 6379); + +$cache = new RedisCache($redis); +$kinopoisk = new Kinopoisk(apiToken: 'token', cache: $cache); +``` + +### Подключение кастомного логгера + +```php +connect('cache.example.com', 6379); + $this->cache = new RedisCache($redis); + + // Настройка Monolog логгера + $this->logger = new \Monolog\Logger('kinopoiskdev'); + $this->logger->pushHandler(new \Monolog\Handler\StreamHandler('logs/kinopoisk.log')); + } + + public function createKinopoiskClient(): Kinopoisk { + return new Kinopoisk( + apiToken: $_ENV['KINOPOISK_API_TOKEN'], + cache: $this->cache, + logger: $this->logger + ); + } +} +``` + +## Интеграция с сервисами + +### CacheService + +Встроенная реализация CacheInterface: + +```php +use KinopoiskDev\Services\CacheService; + +$cache = new CacheService(); +$kinopoisk = new Kinopoisk(apiToken: 'token', cache: $cache); + +// Кэширование автоматически работает для всех запросов +$movie = $kinopoisk->getMovieById(301); // Результат кэшируется +``` + +### Автоматическое логирование + +Логгер автоматически записывает все операции: + +```php +$kinopoisk = new Kinopoisk(apiToken: 'token', logger: $logger); + +// Автоматически логируется +$kinopoisk->searchMovies($filter); +// [INFO] HTTP request started: GET /v1.4/movie?year=2023 +// [INFO] HTTP request completed: 200 OK +``` + +## Связанные разделы + +- **[CacheService](../Services/CacheService.md)** - встроенная реализация кэша +- **[ValidationService](../Services/ValidationService.md)** - сервис валидации +- **[Kinopoisk](../Kinopoisk.md)** - главный класс с поддержкой контрактов + +## Преимущества + +### Стандартизация + +```php +// Единый интерфейс для всех кэш-драйверов +interface CacheInterface { + public function get(string $key): mixed; + public function set(string $key, mixed $value, int $ttl): bool; +} +``` + +### Расширяемость + +```php +// Легкая замена реализации +$kinopoisk = new Kinopoisk( + apiToken: 'token', + cache: new RedisCache($redis), // Redis + logger: new MonologLogger() // Monolog +); +``` + +### Тестируемость + +```php +// Легкое создание моков для тестов +$mockCache = $this->createMock(CacheInterface::class); +$mockLogger = $this->createMock(LoggerInterface::class); + +$kinopoisk = new Kinopoisk( + apiToken: 'token', + cache: $mockCache, + logger: $mockLogger +); +``` + +## Полезные ссылки + +- **[PSR-3 Logger Interface](https://www.php-fig.org/psr/psr-3/)** - стандарт логирования +- **[PSR-16 Cache Interface](https://www.php-fig.org/psr/psr-16/)** - стандарт кэширования +- **[CacheService](../Services/CacheService.md)** - встроенная реализация кэша +- **[Kinopoisk](../Kinopoisk.md)** - главный класс + +--- + +**Интерфейсы KinopoiskDev** - обеспечивают стандартизацию и расширяемость библиотеки через PSR совместимые интерфейсы. diff --git a/docs/dev/kinopoiskdev/Enums/.nav.yml b/docs/dev/kinopoiskdev/Enums/.nav.yml index 297e0f7..56e1ee1 100644 --- a/docs/dev/kinopoiskdev/Enums/.nav.yml +++ b/docs/dev/kinopoiskdev/Enums/.nav.yml @@ -1,5 +1,6 @@ title: Перечисления nav: + - "index.md" - "*" sort: type: alphabetical diff --git a/docs/dev/kinopoiskdev/Enums/index.md b/docs/dev/kinopoiskdev/Enums/index.md new file mode 100644 index 0000000..7ef0454 --- /dev/null +++ b/docs/dev/kinopoiskdev/Enums/index.md @@ -0,0 +1,466 @@ +--- +title: Перечисления +description: Система перечислений KinopoiskDev для типизированных констант и значений +keywords: перечисления, enums, фильтры, сортировка, статусы, типы +category: enums +tags: + - Kinopoisk + - enums +--- + +# Перечисления + +Система перечислений KinopoiskDev предоставляет типизированные константы для всех возможных значений, используемых в API. Все enum'ы основаны на PHP 8.1+ перечислениях для обеспечения типобезопасности и читаемости кода. + +## Обзор + +Перечисления в KinopoiskDev используются для: + +- **Типобезопасности** - предотвращение использования недопустимых значений +- **Читаемости кода** - понятные названия вместо магических чисел +- **Валидации** - автоматическая проверка допустимых значений +- **Документации** - самодокументируемый код с описаниями + +## Доступные перечисления + +### FilterField + +**Файл:** [FilterField.md](FilterField.md) + +Enum для полей фильтрации, содержащий все возможные поля для фильтрации данных через API: + +```php +enum FilterField: string { + case ID = 'id'; + case NAME = 'name'; + case YEAR = 'year'; + case RATING_KP = 'rating.kp'; + case GENRES = 'genres.name'; + case COUNTRIES = 'countries.name'; + // ... и многие другие +} +``` + +**Возможности:** + +- Все поля API для фильтрации +- Поддержка составных полей (rating.kp, votes.imdb) +- Методы для определения типа поля +- Проверка поддержки операторов + +### FilterOperator + +**Файл:** [FilterOperator.md](FilterOperator.md) + +Enum для операторов фильтрации, определяющий все возможные операции сравнения: + +```php +enum FilterOperator: string { + case EQUALS = 'eq'; + case NOT_EQUALS = 'ne'; + case GREATER_THAN = 'gt'; + case LESS_THAN = 'lt'; + case IN = 'in'; + case NOT_IN = 'nin'; + case RANGE = 'range'; + // ... и другие +} +``` + +**Возможности:** + +- Операторы сравнения (eq, ne, gt, lt, gte, lte) +- Операторы включения/исключения (in, nin, all) +- Операторы диапазонов (range) +- Регулярные выражения (regex) + +### SortField + +**Файл:** [SortField.md](SortField.md) + +Enum для полей сортировки при поиске фильмов и персон: + +```php +enum SortField: string { + case ID = 'id'; + case NAME = 'name'; + case YEAR = 'year'; + case RATING_KP = 'rating.kp'; + case VOTES_KP = 'votes.kp'; + case CREATED_AT = 'createdAt'; + // ... и другие +} +``` + +**Возможности:** + +- Поля для сортировки фильмов +- Поля для сортировки персон +- Методы для определения типа данных +- Рекомендуемые направления сортировки + +### SortDirection + +**Файл:** [SortDirection.md](SortDirection.md) + +Enum для направления сортировки результатов поиска: + +```php +enum SortDirection: string { + case ASC = 'asc'; + case DESC = 'desc'; +} +``` + +**Возможности:** + +- Возрастающая сортировка (ASC) +- Убывающая сортировка (DESC) +- Методы для получения противоположного направления +- Символьные представления (↑, ↓) + +### MovieType + +**Файл:** [MovieType.md](MovieType.md) + +Enum для типов фильмов, возвращаемых API: + +```php +enum MovieType: string { + case MOVIE = 'movie'; + case TV_SERIES = 'tv-series'; + case CARTOON = 'cartoon'; + case ANIME = 'anime'; + case ANIMATED_SERIES = 'animated-series'; + case TV_SHOW = 'tv-show'; +} +``` + +**Возможности:** + +- Все типы контента КиноПоиска +- Человекочитаемые названия +- Фильтрация по типам + +### MovieStatus + +**Файл:** [MovieStatus.md](MovieStatus.md) + +Enum для статусов фильмов в производстве: + +```php +enum MovieStatus: string { + case FILMING = 'filming'; + case PRE_PRODUCTION = 'pre-production'; + case COMPLETED = 'completed'; + case ANNOUNCED = 'announced'; + case POST_PRODUCTION = 'post-production'; +} +``` + +**Возможности:** + +- Статусы производства фильмов +- Фильтрация по статусам +- Человекочитаемые названия + +### PersonProfession + +**Файл:** [PersonProfession.md](PersonProfession.md) + +Enum для профессий персон в кинематографе: + +```php +enum PersonProfession: string { + case ACTOR = 'actor'; + case DIRECTOR = 'director'; + case WRITER = 'writer'; + case PRODUCER = 'producer'; + case COMPOSER = 'composer'; + // ... и другие +} +``` + +**Возможности:** + +- Все профессии в кинематографе +- Поддержка русского и английского языков +- Множественные формы названий +- Фильтрация персон по профессиям + +### PersonSex + +**Файл:** [PersonSex.md](PersonSex.md) + +Enum для пола персон: + +```php +enum PersonSex: string { + case MALE = 'male'; + case FEMALE = 'female'; +} +``` + +**Возможности:** + +- Определение пола персон +- Русские названия +- Фильтрация по полу + +### RatingMpaa + +**Файл:** [RatingMpaa.md](RatingMpaa.md) + +Enum для рейтингов MPAA (Американская ассоциация кинокомпаний): + +```php +enum RatingMpaa: string { + case G = 'g'; + case PG = 'pg'; + case PG13 = 'pg13'; + case R = 'r'; + case NC17 = 'nc17'; +} +``` + +**Возможности:** + +- Все рейтинги MPAA +- Описания возрастных ограничений +- Фильтрация по возрастным рейтингам + +### ImageType + +**Файл:** [ImageType.md](ImageType.md) + +Enum для типов изображений: + +```php +enum ImageType: string { + case BACKDROP = 'backdrops'; + case COVER = 'cover'; + case FRAME = 'frame'; + case PROMO = 'promo'; + case SCREENSHOT = 'screenshot'; + case SHOOTING = 'shooting'; + case STILL = 'still'; + case WALLPAPER = 'wallpaper'; +} +``` + +**Возможности:** + +- Все типы изображений +- Фильтрация изображений по типам +- Специализированные фильтры + +### HttpStatusCode + +**Файл:** [HttpStatusCode.md](HttpStatusCode.md) + +Enum для HTTP статус кодов, используемых в API: + +```php +enum HttpStatusCode: int { + case OK = 200; + case UNAUTHORIZED = 401; + case FORBIDDEN = 403; + case NOT_FOUND = 404; + case INTERNAL_SERVER_ERROR = 500; +} +``` + +**Возможности:** + +- Основные HTTP статус коды +- Описания на русском языке +- Проверка успешности/ошибки + +### ReviewType + +**Файл:** [ReviewType.md](ReviewType.md) + +Enum для типов отзывов: + +```php +enum ReviewType: string { + case POSITIVE = 'Позитивный'; + case NEGATIVE = 'Негативный'; + case NEUTRAL = 'Нейтральный'; +} +``` + +**Возможности:** + +- Типы отзывов +- Фильтрация отзывов +- Русские названия + +### ListCategory + +**Файл:** [ListCategory.md](ListCategory.md) + +Enum для категорий списков: + +```php +enum ListCategory: string { + case ONLINE = 'Онлайн-кинотеатр'; + case AWARD = 'Премии'; + case FEE = 'Сборы'; + case SERIES = 'Сериалы'; + case MOVIE = 'Фильмы'; +} +``` + +**Возможности:** + +- Категории списков КиноПоиска +- Фильтрация по категориям +- Русские названия + +### StudioType + +**Файл:** [StudioType.md](StudioType.md) + +Enum для типов студий: + +```php +enum StudioType: string { + case PRODUCTION = 'Производство'; + case SPECIAL_EFFECTS = 'Спецэффекты'; + case DISTRIBUTION = 'Прокат'; + case DUBBING_STUDIO = 'Студия дубляжа'; +} +``` + +**Возможности:** + +- Типы студий в кинематографе +- Описания на русском и английском +- Фильтрация студий по типам + +## Использование + +### Базовые примеры + +```php +addFilter(FilterField::YEAR, FilterOperator::EQUALS, 2023); +$filter->addFilter(FilterField::TYPE, FilterOperator::EQUALS, MovieType::MOVIE); + +// Использование в сортировке +$filter->sortBy(FilterField::RATING_KP, SortDirection::DESC); +``` + +### Проверка типов полей + +```php +// Проверка поддержки диапазонов +if (FilterField::YEAR->supportsRange()) { + $filter->addRangeFilter(FilterField::YEAR, 2020, 2024); +} + +// Проверка поддержки включения/исключения +if (FilterField::GENRES->supportsIncludeExclude()) { + $filter->withIncludedGenres(['драма', 'комедия']); +} +``` + +### Работа с направлениями сортировки + +```php +$direction = SortDirection::ASC; +$reverseDirection = $direction->reverse(); // DESC + +echo $direction->getSymbol(); // ↑ +echo $direction->getDescription(); // Сортировка по возрастанию +``` + +### Фильтрация по профессиям + +```php +use KinopoiskDev\Enums\PersonProfession; + +$filter = new PersonSearchFilter(); +$filter->withProfession(PersonProfession::ACTOR); + +// Получение русского названия +echo PersonProfession::ACTOR->getRussianName(); // "Актер" +echo PersonProfession::ACTOR->getRussianPluralName(); // "Актеры" +``` + +## Интеграция с фильтрами + +### Автоматическая валидация + +```php +// Enum'ы автоматически валидируются в фильтрах +$filter = new MovieSearchFilter(); +$filter->withType(MovieType::MOVIE); // ✅ Корректно +$filter->withType('invalid_type'); // ❌ Ошибка валидации +``` + +### Типобезопасность + +```php +// IDE поддержка и автодополнение +$filter->withStatus(MovieStatus::COMPLETED); +$filter->withRatingMpaa(RatingMpaa::PG13); +$filter->withImageType(ImageType::POSTER); +``` + +## Связанные разделы + +- **[Filter](../Filter/)** - классы фильтров, использующие enum'ы +- **[Utils](../Utils/)** - утилиты для работы с enum'ами +- **[Kinopoisk](../Kinopoisk.md)** - главный класс с поддержкой enum'ов + +## Преимущества + +### Типобезопасность + +```php +// Вместо строковых констант +$filter->addFilter('year', 'eq', 2023); + +// Используйте enum'ы +$filter->addFilter(FilterField::YEAR, FilterOperator::EQUALS, 2023); +``` + +### Читаемость + +```php +// Понятные названия вместо магических чисел +$filter->withType(MovieType::TV_SERIES); +$filter->withStatus(MovieStatus::FILMING); +$filter->withProfession(PersonProfession::DIRECTOR); +``` + +### Валидация + +```php +// Автоматическая проверка допустимых значений +enum MovieType: string { + case MOVIE = 'movie'; + case TV_SERIES = 'tv-series'; + // Только эти значения допустимы +} +``` + +## Полезные ссылки + +- **[PHP Enums Documentation](https://www.php.net/manual/en/language.enumerations.php)** - официальная документация PHP +- **[Filter Classes](../Filter/)** - классы фильтров +- **[Utils](../Utils/)** - утилиты для работы с enum'ами + +--- + +**Перечисления KinopoiskDev** - обеспечивают типобезопасность и читаемость кода через строго типизированные константы. diff --git a/docs/dev/kinopoiskdev/Exceptions/.nav.yml b/docs/dev/kinopoiskdev/Exceptions/.nav.yml index 532df33..fe2edba 100644 --- a/docs/dev/kinopoiskdev/Exceptions/.nav.yml +++ b/docs/dev/kinopoiskdev/Exceptions/.nav.yml @@ -1,5 +1,6 @@ title: Исключения nav: + - "index.md" - "*" sort: type: alphabetical diff --git a/docs/dev/kinopoiskdev/Exceptions/index.md b/docs/dev/kinopoiskdev/Exceptions/index.md new file mode 100644 index 0000000..7d5f0c4 --- /dev/null +++ b/docs/dev/kinopoiskdev/Exceptions/index.md @@ -0,0 +1,365 @@ +--- +title: Исключения +description: Система исключений KinopoiskDev для обработки ошибок и валидации +keywords: исключения, exceptions, ошибки, валидация, обработка ошибок +category: exceptions +tags: + - Kinopoisk + - exceptions +--- + +# Исключения + +Система исключений KinopoiskDev предоставляет специализированные классы для обработки различных типов ошибок. Все исключения наследуются от базового класса и предоставляют детальную информацию об ошибках для эффективной диагностики и отладки. + +## Обзор + +Исключения в KinopoiskDev используются для: + +- **Специфичной обработки ошибок** - разные типы исключений для разных ситуаций +- **Детальной диагностики** - подробная информация об ошибках +- **Цепочки исключений** - сохранение контекста ошибок +- **Типобезопасности** - строгая типизация исключений + +## Доступные исключения + +### KinopoiskDevException + +**Файл:** [KinopoiskDevException.md](KinopoiskDevException.md) + +Базовое исключение для всех ошибок библиотеки KinopoiskDev: + +```php +class KinopoiskDevException extends Exception { + public function __construct( + string $message, + int $code = 0, + ?Exception $previous = null + ); +} +``` + +**Возможности:** + +- Базовый класс для всех исключений библиотеки +- Поддержка цепочки исключений +- Единообразный интерфейс обработки ошибок +- Совместимость со стандартными PHP исключениями + +**Использование:** + +```php +try { + $kinopoisk = new Kinopoisk(); + $movie = $kinopoisk->getMovieById(123); +} catch (KinopoiskDevException $e) { + echo "Ошибка: " . $e->getMessage(); + echo "Код: " . $e->getCode(); +} +``` + +### ValidationException + +**Файл:** [ValidationException.md](ValidationException.md) + +Специализированное исключение для ошибок валидации данных: + +```php +class ValidationException extends KinopoiskDevException { + private array $errors = []; + private ?string $field = null; + private mixed $value = null; + + public function __construct( + string $message, + ?string $field = null, + mixed $value = null, + int $code = 0, + ?Throwable $previous = null + ); + + public static function forField(string $field, string $message, mixed $value = null): self; + public static function withErrors(array $errors): self; + public function getErrors(): array; + public function getField(): ?string; + public function getValue(): mixed; + public function getFirstError(): ?string; + public function hasErrors(): bool; +} +``` + +**Возможности:** + +- Множественные ошибки валидации +- Информация о проблемном поле и значении +- Фабричные методы для создания исключений +- Удобные методы для получения ошибок + +**Использование:** + +```php +try { + $movie = Movie::fromArray($data); + $movie->validate(); +} catch (ValidationException $e) { + if ($e->hasErrors()) { + foreach ($e->getErrors() as $field => $error) { + echo "Поле {$field}: {$error}\n"; + } + } else { + echo "Ошибка валидации: " . $e->getFirstError(); + } +} +``` + +### KinopoiskResponseException + +**Файл:** [KinopoiskResponseException.md](KinopoiskResponseException.md) + +Исключение для ошибок HTTP ответов от API Kinopoisk.dev: + +```php +class KinopoiskResponseException extends KinopoiskDevException { + public function __construct( + string $responseClass, + ?Exception $previous = null + ); +} +``` + +**Возможности:** + +- Автоматическое извлечение информации об ошибке из ответа API +- Специализированные исключения для разных HTTP статусов +- Интеграция с классами ответов API +- Детальная информация об ошибках API + +**Использование:** + +```php +try { + $movie = $kinopoisk->getMovieById(999999); +} catch (KinopoiskResponseException $e) { + echo "Ошибка API: " . $e->getMessage(); + echo "Код: " . $e->getCode(); // 404, 401, 403, 500 и т.д. +} +``` + +## Использование + +### Базовый пример обработки ошибок + +```php +getMovieById(301); + +} catch (ValidationException $e) { + // Ошибки валидации данных + echo "Ошибка валидации: " . $e->getFirstError(); + +} catch (KinopoiskResponseException $e) { + // Ошибки API (401, 403, 404, 500) + echo "Ошибка API: " . $e->getMessage(); + echo "HTTP код: " . $e->getCode(); + +} catch (KinopoiskDevException $e) { + // Общие ошибки библиотеки + echo "Ошибка библиотеки: " . $e->getMessage(); + +} catch (Exception $e) { + // Неожиданные ошибки + echo "Неожиданная ошибка: " . $e->getMessage(); +} +``` + +### Обработка множественных ошибок валидации + +```php +try { + $movie = new Movie(); + $movie->title = ''; // Пустая строка + $movie->year = -1; // Отрицательный год + $movie->validate(); + +} catch (ValidationException $e) { + if ($e->hasErrors()) { + echo "Найдены ошибки валидации:\n"; + foreach ($e->getErrors() as $field => $error) { + echo "- {$field}: {$error}\n"; + } + } +} +``` + +### Создание кастомных исключений + +```php +class CustomValidationException extends ValidationException { + public function __construct(string $message, array $errors = []) { + parent::__construct($message, null, null, 0, null); + $this->errors = $errors; + } + + public function getCustomMessage(): string { + return "Кастомная ошибка: " . $this->getMessage(); + } +} + +// Использование +throw new CustomValidationException( + "Ошибка валидации фильма", + ['title' => 'Название обязательно', 'year' => 'Год должен быть положительным'] +); +``` + +### Логирование исключений + +```php +use Psr\Log\LoggerInterface; + +class ExceptionHandler { + private LoggerInterface $logger; + + public function __construct(LoggerInterface $logger) { + $this->logger = $logger; + } + + public function handle(KinopoiskDevException $e): void { + $context = [ + 'exception_class' => get_class($e), + 'code' => $e->getCode(), + 'file' => $e->getFile(), + 'line' => $e->getLine() + ]; + + if ($e instanceof ValidationException) { + $context['errors'] = $e->getErrors(); + $context['field'] = $e->getField(); + $this->logger->warning('Validation error', $context); + + } elseif ($e instanceof KinopoiskResponseException) { + $this->logger->error('API error', $context); + + } else { + $this->logger->critical('Library error', $context); + } + } +} +``` + +## Интеграция с сервисами + +### ValidationService + +ValidationService автоматически выбрасывает ValidationException: + +```php +use KinopoiskDev\Services\ValidationService; + +$validator = new ValidationService(); +$movie = new Movie(); + +try { + $validator->validate($movie); +} catch (ValidationException $e) { + // Автоматически выбрасывается при ошибках валидации + echo "Ошибки валидации: " . implode(', ', $e->getErrors()); +} +``` + +### Автоматическая обработка в Kinopoisk + +Главный класс Kinopoisk автоматически обрабатывает исключения API: + +```php +$kinopoisk = new Kinopoisk(apiToken: 'token'); + +try { + $movie = $kinopoisk->getMovieById(999999); +} catch (KinopoiskResponseException $e) { + // Автоматически выбрасывается при ошибках API + switch ($e->getCode()) { + case 401: + echo "Неверный API ключ"; + break; + case 404: + echo "Фильм не найден"; + break; + case 429: + echo "Превышен лимит запросов"; + break; + default: + echo "Ошибка API: " . $e->getMessage(); + } +} +``` + +## Связанные разделы + +- **[ValidationService](../Services/ValidationService.md)** - сервис валидации +- **[Kinopoisk](../Kinopoisk.md)** - главный класс с обработкой исключений +- **[Attributes](../Attributes/)** - атрибуты валидации + +## Преимущества + +### Специфичная обработка + +```php +// Разные типы исключений для разных ситуаций +try { + $result = $kinopoisk->searchMovies($filter); +} catch (ValidationException $e) { + // Ошибки валидации фильтра + handleValidationError($e); +} catch (KinopoiskResponseException $e) { + // Ошибки API + handleApiError($e); +} catch (KinopoiskDevException $e) { + // Общие ошибки библиотеки + handleLibraryError($e); +} +``` + +### Детальная диагностика + +```php +// Подробная информация об ошибках +catch (ValidationException $e) { + echo "Поле: " . $e->getField(); + echo "Значение: " . $e->getValue(); + echo "Ошибки: " . implode(', ', $e->getErrors()); +} +``` + +### Цепочка исключений + +```php +// Сохранение контекста ошибок +try { + $result = processData($data); +} catch (Exception $e) { + throw new KinopoiskDevException( + "Ошибка обработки данных", + 500, + $e // Сохранение оригинального исключения + ); +} +``` + +## Полезные ссылки + +- **[PHP Exceptions Documentation](https://www.php.net/manual/en/language.exceptions.php)** - официальная документация PHP +- **[ValidationService](../Services/ValidationService.md)** - сервис валидации +- **[Kinopoisk](../Kinopoisk.md)** - главный класс + +--- + +**Исключения KinopoiskDev** - обеспечивают надежную обработку ошибок с детальной диагностикой и типобезопасностью. diff --git a/docs/dev/kinopoiskdev/Filter/.nav.yml b/docs/dev/kinopoiskdev/Filter/.nav.yml index f9d0742..826ce6d 100644 --- a/docs/dev/kinopoiskdev/Filter/.nav.yml +++ b/docs/dev/kinopoiskdev/Filter/.nav.yml @@ -1,5 +1,6 @@ title: Фильтры nav: + - "index.md" - "*" sort: type: alphabetical diff --git a/docs/dev/kinopoiskdev/Filter/index.md b/docs/dev/kinopoiskdev/Filter/index.md new file mode 100644 index 0000000..1b4c286 --- /dev/null +++ b/docs/dev/kinopoiskdev/Filter/index.md @@ -0,0 +1,396 @@ +--- +title: Фильтры +description: Система фильтров KinopoiskDev для гибкого поиска и фильтрации данных +keywords: фильтры, фильтрация, поиск, movie, person, image, keyword +category: filter +tags: + - Kinopoisk + - filter + - search +--- + +# Фильтры + +Система фильтров KinopoiskDev предоставляет мощные и гибкие инструменты для поиска и фильтрации данных через API. Все фильтры основаны на объектно-ориентированном подходе с использованием PHP 8.3+ возможностей для обеспечения типобезопасности и читаемости кода. + +## Обзор + +Фильтры в KinopoiskDev используются для: + +- **Поиска данных** - гибкие критерии поиска фильмов, персон, изображений +- **Фильтрации результатов** - точная настройка параметров запросов +- **Сортировки** - упорядочивание результатов по различным критериям +- **Пагинации** - управление объемом возвращаемых данных + +## Доступные фильтры + +### MovieSearchFilter + +**Файл:** [MovieSearchFilter.md](MovieSearchFilter.md) + +Специализированный фильтр для поиска фильмов с расширенными возможностями: + +```php +$filter = new MovieSearchFilter(); +$filter->withYearBetween(2020, 2024) + ->withMinRating(7.0, 'kp') + ->withAllGenres(['драма', 'комедия']) + ->onlyMovies() + ->inTop250(); +``` + +**Возможности:** + +- Поиск по диапазону годов +- Фильтрация по рейтингам (KP, IMDB, TMDB) +- Работа с жанрами (включение/исключение) +- Фильтрация по странам +- Поиск по актерам и режиссерам +- Фильтрация по типам контента +- Поиск в топ-списках + +### PersonSearchFilter + +**Файл:** [PersonSearchFilter.md](PersonSearchFilter.md) + +Фильтр для поиска персон в кинематографе: + +```php +$filter = new PersonSearchFilter(); +$filter->onlyActors() + ->ageRange(30, 50) + ->withMinRating(7.0, 'kp') + ->withProfession(PersonProfession::DIRECTOR); +``` + +**Возможности:** + +- Фильтрация по профессиям +- Возрастные диапазоны +- Рейтинговые фильтры +- Поиск по полу +- Фильтрация по странам +- Поиск по фильмографии + +### ImageSearchFilter + +**Файл:** [ImageSearchFilter.md](ImageSearchFilter.md) + +Специализированный фильтр для работы с изображениями: + +```php +$filter = new ImageSearchFilter(); +$filter->onlyPosters() + ->minResolution(1920, 1080) + ->onlyHighRes() + ->withType(ImageType::POSTER); +``` + +**Возможности:** + +- Фильтрация по типам изображений +- Фильтры по разрешению +- Поиск высококачественных изображений +- Фильтрация по языку +- Специализированные фильтры для постеров, кадров, скриншотов + +### KeywordSearchFilter + +**Файл:** [KeywordSearchFilter.md](KeywordSearchFilter.md) + +Фильтр для поиска ключевых слов: + +```php +$filter = new KeywordSearchFilter(); +$filter->search('любовь') + ->onlyPopular(10) + ->recentlyCreated(30); +``` + +**Возможности:** + +- Поиск по названию ключевого слова +- Фильтрация по популярности +- Фильтры по датам создания/обновления +- Поиск по связанным фильмам +- Фильтрация по количеству связанных фильмов + +### ReviewSearchFilter + +**Файл:** [ReviewSearchFilter.md](ReviewSearchFilter.md) + +Фильтр для поиска отзывов: + +```php +$filter = new ReviewSearchFilter(); +$filter->withType(ReviewType::POSITIVE) + ->withMinRating(8.0) + ->recentlyCreated(7); +``` + +**Возможности:** + +- Фильтрация по типам отзывов +- Рейтинговые фильтры +- Фильтры по датам +- Поиск по авторам отзывов +- Фильтрация по фильмам + +### SeasonSearchFilter + +**Файл:** [SeasonSearchFilter.md](SeasonSearchFilter.md) + +Фильтр для поиска сезонов сериалов: + +```php +$filter = new SeasonSearchFilter(); +$filter->seasonRange(1, 5) + ->withMinRating(7.0, 'kp') + ->withYearBetween(2020, 2024); +``` + +**Возможности:** + +- Фильтрация по номерам сезонов +- Рейтинговые фильтры +- Фильтры по годам +- Поиск по сериалам +- Фильтрация по количеству эпизодов + +### StudioSearchFilter + +**Файл:** [StudioSearchFilter.md](StudioSearchFilter.md) + +Фильтр для поиска студий: + +```php +$filter = new StudioSearchFilter(); +$filter->withType(StudioType::PRODUCTION) + ->search('Marvel') + ->withCountry('США'); +``` + +**Возможности:** + +- Фильтрация по типам студий +- Поиск по названию +- Фильтры по странам +- Поиск по связанным фильмам +- Фильтрация по датам создания + +### SortCriteria + +**Файл:** [SortCriteria.md](SortCriteria.md) + +Класс для настройки сортировки результатов: + +```php +$sortCriteria = new SortCriteria(); +$sortCriteria->addSort(FilterField::RATING_KP, SortDirection::DESC) + ->addSort(FilterField::YEAR, SortDirection::ASC); +``` + +**Возможности:** + +- Множественная сортировка +- Настройка направлений сортировки +- Валидация полей сортировки +- Автоматическая оптимизация запросов + +## Использование + +### Базовый поиск фильмов + +```php +withYearBetween(2020, 2024) + ->withMinRating(7.0, 'kp') + ->onlyMovies(); + +// Фильтры по жанрам +$filter->withIncludedGenres(['драма', 'комедия']) + ->withExcludedGenres(['ужасы']); + +// Поиск по актерам и режиссерам +$filter->withActor('Том Хэнкс') + ->withDirector('Кристофер Нолан'); + +// Сортировка +$filter->sortBy('rating.kp', SortDirection::DESC); + +$movies = $kinopoisk->searchMovies($filter); +``` + +### Расширенный поиск персон + +```php +onlyActors() + ->withProfession(PersonProfession::DIRECTOR); + +// Возрастные фильтры +$filter->ageRange(30, 60); + +// Рейтинговые фильтры +$filter->withMinRating(7.0, 'kp') + ->withMinVotes(1000, 'kp'); + +// Фильтры по странам +$filter->withCountry('США'); + +$persons = $kinopoisk->searchPersons($filter); +``` + +### Работа с изображениями + +```php +onlyPosters() + ->withType(ImageType::BACKDROP); + +// Фильтры по разрешению +$filter->minResolution(1920, 1080) + ->onlyHighRes(); + +// Фильтры по размерам +$filter->width(1920, 'gte') + ->height(1080, 'gte'); + +$images = $kinopoisk->getMovieImages(301, $filter); +``` + +### Комбинированные фильтры + +```php +withYearBetween(2020, 2024) + ->withMinRating(7.0, 'kp') + ->withMinVotes(1000, 'kp') + ->withAllGenres(['драма']) + ->withIncludedCountries(['США', 'Великобритания']) + ->onlyMovies() + ->inTop250(); + +// Настройка сортировки +$filter->sortBy('rating.kp', SortDirection::DESC) + ->sortBy('year', SortDirection::DESC); + +// Пагинация +$filter->limit(20) + ->offset(40); + +$movies = $kinopoisk->searchMovies($filter); +``` + +## Интеграция с enum'ами + +### Использование типизированных значений + +```php +use KinopoiskDev\Enums\FilterField; +use KinopoiskDev\Enums\FilterOperator; +use KinopoiskDev\Enums\MovieType; +use KinopoiskDev\Enums\PersonProfession; + +$filter = new MovieSearchFilter(); + +// Типобезопасные фильтры +$filter->addFilter(FilterField::TYPE, FilterOperator::EQUALS, MovieType::MOVIE); +$filter->addFilter(FilterField::YEAR, FilterOperator::RANGE, [2020, 2024]); + +// Проверка поддержки операторов +if (FilterField::GENRES->supportsIncludeExclude()) { + $filter->withIncludedGenres(['драма', 'комедия']); +} +``` + +### Автоматическая валидация + +```php +// Enum'ы автоматически валидируются +$filter->withType(MovieType::TV_SERIES); // ✅ Корректно +$filter->withProfession(PersonProfession::ACTOR); // ✅ Корректно + +// Неправильные значения вызывают исключения +$filter->withType('invalid_type'); // ❌ ValidationException +``` + +## Связанные разделы + +- **[Enums](../Enums/)** - перечисления для фильтров +- **[Utils](../Utils/)** - утилиты для работы с фильтрами +- **[Kinopoisk](../Kinopoisk.md)** - главный класс с поддержкой фильтров + +## Преимущества + +### Гибкость + +```php +// Множественные способы фильтрации +$filter->withYearBetween(2020, 2024); // Диапазон +$filter->withMinRating(7.0, 'kp'); // Минимальный рейтинг +$filter->withIncludedGenres(['драма']); // Включение жанров +$filter->withExcludedGenres(['ужасы']); // Исключение жанров +$filter->onlyMovies(); // Тип контента +$filter->inTop250(); // Топ-списки +``` + +### Типобезопасность + +```php +// IDE поддержка и автодополнение +$filter->withType(MovieType::MOVIE); +$filter->withStatus(MovieStatus::COMPLETED); +$filter->withProfession(PersonProfession::ACTOR); +$filter->sortBy(FilterField::RATING_KP, SortDirection::DESC); +``` + +### Читаемость + +```php +// Понятный и самодокументируемый код +$filter->withYearBetween(2020, 2024) + ->withMinRating(7.0, 'kp') + ->withAllGenres(['драма', 'комедия']) + ->onlyMovies() + ->inTop250(); +``` + +## Полезные ссылки + +- **[Enums](../Enums/)** - перечисления для фильтров +- **[Utils](../Utils/)** - утилиты для работы с фильтрами +- **[Kinopoisk](../Kinopoisk.md)** - главный класс + +--- + +**Фильтры KinopoiskDev** - обеспечивают мощную и гибкую систему поиска с типобезопасностью и читаемостью кода. diff --git a/docs/dev/kinopoiskdev/Http/.nav.yml b/docs/dev/kinopoiskdev/Http/.nav.yml index 9e398f4..ce2a915 100644 --- a/docs/dev/kinopoiskdev/Http/.nav.yml +++ b/docs/dev/kinopoiskdev/Http/.nav.yml @@ -1,5 +1,6 @@ title: HTTP запросы nav: + - "index.md" - "*" sort: type: alphabetical diff --git a/docs/dev/kinopoiskdev/Http/index.md b/docs/dev/kinopoiskdev/Http/index.md new file mode 100644 index 0000000..060b5e9 --- /dev/null +++ b/docs/dev/kinopoiskdev/Http/index.md @@ -0,0 +1,458 @@ +--- +title: HTTP запросы +description: Система HTTP запросов KinopoiskDev для работы с API kinopoisk.dev +keywords: http, запросы, api, movie, person, image, requests +category: http +tags: + - Kinopoisk + - http + - requests +--- + +# HTTP запросы + +Система HTTP запросов KinopoiskDev предоставляет низкоуровневые классы для прямого взаимодействия с API kinopoisk.dev. Все классы запросов основаны на объектно-ориентированном подходе с полной типизацией и автоматической обработкой ответов. + +## Обзор + +HTTP запросы в KinopoiskDev используются для: + +- **Прямого доступа к API** - низкоуровневое взаимодействие с kinopoisk.dev +- **Специализированных запросов** - работа с конкретными эндпоинтами +- **Кастомизации** - полный контроль над параметрами запросов +- **Отладки** - детальная информация о запросах и ответах + +## Доступные классы запросов + +### MovieRequests + +**Файл:** [MovieRequests.md](MovieRequests.md) + +Класс для работы с API фильмов, включая поиск, получение деталей и связанных данных: + +```php +$requests = new MovieRequests(apiToken: 'your-token'); + +// Поиск фильмов +$movies = $requests->searchMovies($filter); + +// Получение фильма по ID +$movie = $requests->getMovieById(301); + +// Получение связанных фильмов +$related = $requests->getRelatedMovies(301); + +// Получение фактов о фильме +$facts = $requests->getMovieFacts(301); +``` + +**Возможности:** + +- Поиск фильмов с фильтрами +- Получение детальной информации +- Работа с связанными фильмами +- Получение фактов и отзывов +- Работа с рейтингами и голосами + +### PersonRequests + +**Файл:** [PersonRequests.md](PersonRequests.md) + +Класс для работы с API персон, включая поиск актеров, режиссеров и других участников: + +```php +$requests = new PersonRequests(apiToken: 'your-token'); + +// Поиск персон +$persons = $requests->searchPersons($filter); + +// Получение персоны по ID +$person = $requests->getPersonById(123); + +// Получение фильмографии +$filmography = $requests->getPersonFilmography(123); + +// Получение фактов о персоне +$facts = $requests->getPersonFacts(123); +``` + +**Возможности:** + +- Поиск персон с фильтрами +- Получение детальной информации +- Работа с фильмографией +- Получение фактов и биографии +- Работа с наградами и достижениями + +### ImageRequests + +**Файл:** [ImageRequests.md](ImageRequests.md) + +Класс для работы с API изображений, включая постеры, кадры и другие медиа: + +```php +$requests = new ImageRequests(apiToken: 'your-token'); + +// Получение изображений фильма +$images = $requests->getMovieImages(301, $filter); + +// Получение изображений персоны +$personImages = $requests->getPersonImages(123, $filter); + +// Получение изображений по типам +$posters = $requests->getMoviePosters(301); +$backdrops = $requests->getMovieBackdrops(301); +``` + +**Возможности:** + +- Получение изображений фильмов +- Получение изображений персон +- Фильтрация по типам изображений +- Работа с разрешениями и размерами +- Получение метаданных изображений + +### KeywordRequests + +**Файл:** [KeywordRequests.md](KeywordRequests.md) + +Класс для работы с API ключевых слов и тегов: + +```php +$requests = new KeywordRequests(apiToken: 'your-token'); + +// Поиск ключевых слов +$keywords = $requests->searchKeywords($filter); + +// Получение ключевого слова по ID +$keyword = $requests->getKeywordById(456); + +// Получение фильмов по ключевому слову +$movies = $requests->getMoviesByKeyword(456); +``` + +**Возможности:** + +- Поиск ключевых слов +- Получение информации о ключевых словах +- Работа с фильмами по ключевым словам +- Фильтрация по популярности +- Получение связанных данных + +### ReviewRequests + +**Файл:** [ReviewRequests.md](ReviewRequests.md) + +Класс для работы с API отзывов и рецензий: + +```php +$requests = new ReviewRequests(apiToken: 'your-token'); + +// Поиск отзывов +$reviews = $requests->searchReviews($filter); + +// Получение отзывов фильма +$movieReviews = $requests->getMovieReviews(301); + +// Получение отзыва по ID +$review = $requests->getReviewById(789); +``` + +**Возможности:** + +- Поиск отзывов с фильтрами +- Получение отзывов фильмов +- Работа с типами отзывов +- Фильтрация по рейтингам +- Получение метаданных отзывов + +### SeasonRequests + +**Файл:** [SeasonRequests.md](SeasonRequests.md) + +Класс для работы с API сезонов сериалов: + +```php +$requests = new SeasonRequests(apiToken: 'your-token'); + +// Получение сезонов сериала +$seasons = $requests->getSeasonsByMovieId(123); + +// Получение сезона по ID +$season = $requests->getSeasonById(456); + +// Получение эпизодов сезона +$episodes = $requests->getSeasonEpisodes(456); +``` + +**Возможности:** + +- Получение сезонов сериалов +- Работа с эпизодами +- Получение информации о сезонах +- Фильтрация по номерам сезонов +- Работа с метаданными + +### StudioRequests + +**Файл:** [StudioRequests.md](StudioRequests.md) + +Класс для работы с API студий и кинокомпаний: + +```php +$requests = new StudioRequests(apiToken: 'your-token'); + +// Поиск студий +$studios = $requests->searchStudios($filter); + +// Получение студии по ID +$studio = $requests->getStudioById(789); + +// Получение фильмов студии +$movies = $requests->getStudioMovies(789); +``` + +**Возможности:** + +- Поиск студий с фильтрами +- Получение информации о студиях +- Работа с фильмами студий +- Фильтрация по типам студий +- Получение метаданных + +### ListRequests + +**Файл:** [ListRequests.md](ListRequests.md) + +Класс для работы с API списков и коллекций: + +```php +$requests = new ListRequests(apiToken: 'your-token'); + +// Получение списков +$lists = $requests->getLists($filter); + +// Получение списка по ID +$list = $requests->getListById(101); + +// Получение фильмов списка +$movies = $requests->getListMovies(101); +``` + +**Возможности:** + +- Получение списков фильмов +- Работа с коллекциями +- Фильтрация по категориям +- Получение метаданных списков +- Работа с популярными списками + +## Использование + +### Базовый пример работы с фильмами + +```php +withYearBetween(2020, 2024) + ->withMinRating(7.0, 'kp') + ->onlyMovies(); + +$movies = $requests->searchMovies($filter); + +// Получение детальной информации +$movie = $requests->getMovieById(301); + +// Получение связанных данных +$related = $requests->getRelatedMovies(301); +$facts = $requests->getMovieFacts(301); +$reviews = $requests->getMovieReviews(301); +``` + +### Работа с персонами + +```php +onlyActors() + ->ageRange(30, 50) + ->withMinRating(7.0, 'kp'); + +$persons = $requests->searchPersons($filter); + +// Получение детальной информации +$person = $requests->getPersonById(123); + +// Получение связанных данных +$filmography = $requests->getPersonFilmography(123); +$facts = $requests->getPersonFacts(123); +$images = $requests->getPersonImages(123); +``` + +### Работа с изображениями + +```php +onlyPosters() + ->minResolution(1920, 1080) + ->onlyHighRes(); + +$images = $requests->getMovieImages(301, $filter); + +// Получение изображений персоны +$personImages = $requests->getPersonImages(123, $filter); + +// Специализированные методы +$posters = $requests->getMoviePosters(301); +$backdrops = $requests->getMovieBackdrops(301); +$frames = $requests->getMovieFrames(301); +``` + +### Комбинированные запросы + +```php +getMovieById(301); +$related = $movieRequests->getRelatedMovies(301); +$facts = $movieRequests->getMovieFacts(301); +$reviews = $movieRequests->getMovieReviews(301); + +// Получение информации об актерах +$actors = []; +foreach ($movie->persons as $person) { + if ($person->profession === 'actor') { + $actors[] = $personRequests->getPersonById($person->id); + } +} + +// Получение изображений +$posters = $imageRequests->getMoviePosters(301); +$backdrops = $imageRequests->getMovieBackdrops(301); +``` + +## Интеграция с фильтрами + +### Использование фильтров в запросах + +```php +use KinopoiskDev\Http\MovieRequests; +use KinopoiskDev\Filter\MovieSearchFilter; +use KinopoiskDev\Enums\MovieType; +use KinopoiskDev\Enums\SortDirection; + +$requests = new MovieRequests(apiToken: 'your-api-token'); + +$filter = new MovieSearchFilter(); +$filter->withYearBetween(2020, 2024) + ->withMinRating(7.0, 'kp') + ->withAllGenres(['драма', 'комедия']) + ->onlyMovies() + ->inTop250() + ->sortBy('rating.kp', SortDirection::DESC) + ->limit(20); + +$movies = $requests->searchMovies($filter); +``` + +### Автоматическая обработка ответов + +```php +// Все запросы автоматически возвращают типизированные объекты +$movie = $requests->getMovieById(301); +echo $movie->name; // "Матрица" +echo $movie->year; // 1999 +echo $movie->rating->kp; // 8.7 + +// Массивы также типизированы +$movies = $requests->searchMovies($filter); +foreach ($movies as $movie) { + echo $movie->name . " (" . $movie->year . ")\n"; +} +``` + +## Связанные разделы + +- **[Filter](../Filter/)** - классы фильтров для запросов +- **[Models](../Models/)** - модели данных для ответов +- **[Responses](../Responses/)** - классы ответов API +- **[Kinopoisk](../Kinopoisk.md)** - главный класс с высокоуровневым API + +## Преимущества + +### Низкоуровневый контроль + +```php +// Прямой доступ к API эндпоинтам +$requests = new MovieRequests(apiToken: 'token'); +$movie = $requests->getMovieById(301); +$related = $requests->getRelatedMovies(301); +$facts = $requests->getMovieFacts(301); +``` + +### Типобезопасность + +```php +// Все ответы типизированы +$movie = $requests->getMovieById(301); +$movie->name; // string +$movie->year; // int +$movie->rating->kp; // float +$movie->persons; // array +``` + +### Гибкость + +```php +// Полный контроль над запросами +$filter = new MovieSearchFilter(); +$filter->withYearBetween(2020, 2024) + ->withMinRating(7.0, 'kp') + ->withAllGenres(['драма']) + ->onlyMovies() + ->inTop250(); + +$movies = $requests->searchMovies($filter); +``` + +## Полезные ссылки + +- **[Filter](../Filter/)** - классы фильтров +- **[Models](../Models/)** - модели данных +- **[Responses](../Responses/)** - классы ответов +- **[Kinopoisk](../Kinopoisk.md)** - главный класс + +--- + +**HTTP запросы KinopoiskDev** - обеспечивают низкоуровневый доступ к API с полной типизацией и гибкостью. diff --git a/docs/dev/kinopoiskdev/Kinopoisk.md b/docs/dev/kinopoiskdev/Kinopoisk.md index 9b3b375..89c0683 100644 --- a/docs/dev/kinopoiskdev/Kinopoisk.md +++ b/docs/dev/kinopoiskdev/Kinopoisk.md @@ -5,6 +5,7 @@ обработки ответов, кэширования и управления ошибками. Использует современные PHP 8.3 возможности и архитектурные паттерны. Основные возможности: + - Выполнение HTTP запросов к API Kinopoisk.dev - Автоматическое кэширование ответов - Валидация входных данных @@ -17,11 +18,11 @@ PHP 8.3 возможности и архитектурные паттерны. **См. также:** -* `\KinopoiskDev\Http\MovieRequests`: Для работы с фильмами -* `\KinopoiskDev\Http\PersonRequests`: Для работы с персонами -* `\KinopoiskDev\Http\StudioRequests`: Для работы со студиями -* `\KinopoiskDev\Contracts\CacheInterface`: Интерфейс кэширования -* `\KinopoiskDev\Contracts\LoggerInterface`: Интерфейс логирования +- `\KinopoiskDev\Http\MovieRequests`: Для работы с фильмами +- `\KinopoiskDev\Http\PersonRequests`: Для работы с персонами +- `\KinopoiskDev\Http\StudioRequests`: Для работы со студиями +- `\KinopoiskDev\Contracts\CacheInterface`: Интерфейс кэширования +- `\KinopoiskDev\Contracts\LoggerInterface`: Интерфейс логирования ## `__construct()` @@ -34,26 +35,27 @@ PHP 8.3 возможности и архитектурные паттерны. **Параметры:** -* `$apiToken` (string|null): Токен авторизации API (если null, берется из $_ENV['KINOPOISK_TOKEN']) -* `$httpClient` (HttpClient|null): HTTP клиент (если null, создается новый) -* `$cache` (CacheInterface|null): Сервис кэширования (если null, создается FilesystemAdapter) -* `$logger` (LoggerInterface|null): Логгер (если null, логирование отключено) -* `$useCache` (bool): Использовать кэширование (по умолчанию false) -* `$responseValidator` (ValidationService|null): Валидатор ответов API (если null, валидация отключена) +- `$apiToken` (string|null): Токен авторизации API (если null, берется из $\_ENV['KINOPOISK_TOKEN']) +- `$httpClient` (HttpClient|null): HTTP клиент (если null, создается новый) +- `$cache` (CacheInterface|null): Сервис кэширования (если null, создается FilesystemAdapter) +- `$logger` (LoggerInterface|null): Логгер (если null, логирование отключено) +- `$useCache` (bool): Использовать кэширование (по умолчанию false) +- `$responseValidator` (ValidationService|null): Валидатор ответов API (если null, валидация отключена) **Исключения:** -* `ValidationException`: При отсутствии токена или неверном формате -* `KinopoiskDevException`: При ошибке инициализации компонентов +- `ValidationException`: При отсутствии токена или неверном формате +- `KinopoiskDevException`: При ошибке инициализации компонентов **Пример:** + ```php // Минимальная инициализация $kinopoisk = new Kinopoisk(); // С кастомными параметрами $kinopoisk = new Kinopoisk( -apiToken: 'ABC1DEF-2GH3IJK-4LM5NOP-6QR7STU', -useCache: true + apiToken: 'ABC1DEF-2GH3IJK-4LM5NOP-6QR7STU', + useCache: true ); // С кастомным HTTP клиентом и логгером $httpClient = new HttpClient(['timeout' => 60]); @@ -72,11 +74,11 @@ $kinopoisk = new Kinopoisk('your-api-token', $httpClient, null, $logger); **Параметры:** -* `$apiToken` (string|null): Токен API для валидации +- `$apiToken` (string|null): Токен API для валидации **Исключения:** -* `ValidationException`: При отсутствии токена или неверном формате +- `ValidationException`: При отсутствии токена или неверном формате ## `createDefaultHttpClient()` @@ -96,15 +98,15 @@ $kinopoisk = new Kinopoisk('your-api-token', $httpClient, null, $logger); **Параметры:** -* `$method` (string): HTTP метод -* `$endpoint` (string): Конечная точка API -* `$apiVersion` (string|null): Версия API +- `$method` (string): HTTP метод +- `$endpoint` (string): Конечная точка API +- `$apiVersion` (string|null): Версия API **Возвращает:** `array` Декодированные данные ответа **Исключения:** -* `KinopoiskDevException`: При ошибках запроса или валидации +- `KinopoiskDevException`: При ошибках запроса или валидации ## `buildFullUrl()` @@ -112,9 +114,9 @@ $kinopoisk = new Kinopoisk('your-api-token', $httpClient, null, $logger); **Параметры:** -* `$method` (string): HTTP метод -* `$endpoint` (string): Конечная точка -* `$version` (string): Версия API +- `$method` (string): HTTP метод +- `$endpoint` (string): Конечная точка +- `$version` (string): Версия API **Возвращает:** `string` Полный URL @@ -129,25 +131,26 @@ $kinopoisk = new Kinopoisk('your-api-token', $httpClient, null, $logger); **Параметры:** -* `$method` (string): HTTP метод (GET, POST, PUT, DELETE, PATCH) -* `$endpoint` (string): Конечная точка API (без версии) -* `$apiVersion` (string|null): Версия API (если null, используется API_VERSION) +- `$method` (string): HTTP метод (GET, POST, PUT, DELETE, PATCH) +- `$endpoint` (string): Конечная точка API (без версии) +- `$apiVersion` (string|null): Версия API (если null, используется API_VERSION) **Возвращает:** `ResponseInterface` Ответ от API **Исключения:** -* `KinopoiskDevException`: При ошибках валидации или HTTP запроса -* `ValidationException`: При неверных параметрах запроса +- `KinopoiskDevException`: При ошибках валидации или HTTP запроса +- `ValidationException`: При неверных параметрах запроса **Пример:** + ```php // Простой GET запрос $response = $kinopoisk->makeRequest('GET', 'movie/123'); // GET запрос с параметрами $response = $kinopoisk->makeRequest('GET', 'movie', [ -'page' => 1, -'limit' => 10 + 'page' => 1, + 'limit' => 10 ]); // Запрос к другой версии API $response = $kinopoisk->makeRequest('GET', 'movie/123', [], 'v1.3'); @@ -162,11 +165,11 @@ $response = $kinopoisk->makeRequest('GET', 'movie/123', [], 'v1.3'); **Параметры:** -* `$method` (string): HTTP метод для валидации +- `$method` (string): HTTP метод для валидации **Исключения:** -* `ValidationException`: При неверном или неподдерживаемом методе +- `ValidationException`: При неверном или неподдерживаемом методе ## `validateEndpoint()` @@ -178,11 +181,11 @@ $response = $kinopoisk->makeRequest('GET', 'movie/123', [], 'v1.3'); **Параметры:** -* `$endpoint` (string): Конечная точка для валидации +- `$endpoint` (string): Конечная точка для валидации **Исключения:** -* `ValidationException`: При неверном формате конечной точки +- `ValidationException`: При неверном формате конечной точки ## `generateCacheKey()` @@ -194,9 +197,9 @@ $response = $kinopoisk->makeRequest('GET', 'movie/123', [], 'v1.3'); **Параметры:** -* `$method` (string): HTTP метод -* `$endpoint` (string): Конечная точка -* `$version` (string): Версия API +- `$method` (string): HTTP метод +- `$endpoint` (string): Конечная точка +- `$version` (string): Версия API **Возвращает:** `string` Уникальный ключ кэша @@ -210,15 +213,15 @@ $response = $kinopoisk->makeRequest('GET', 'movie/123', [], 'v1.3'); **Параметры:** -* `$method` (string): HTTP метод -* `$endpoint` (string): Конечная точка -* `$version` (string): Версия API +- `$method` (string): HTTP метод +- `$endpoint` (string): Конечная точка +- `$version` (string): Версия API **Возвращает:** `ResponseInterface` Ответ от сервера **Исключения:** -* `GuzzleException`: При ошибке выполнения HTTP запроса +- `GuzzleException`: При ошибке выполнения HTTP запроса ## `parseResponse()` @@ -231,18 +234,19 @@ $response = $kinopoisk->makeRequest('GET', 'movie/123', [], 'v1.3'); **Параметры:** -* `$response` (ResponseInterface): HTTP ответ от API -* `$requestUrl` (string|null): Полный URL запроса для валидации (опционально) +- `$response` (ResponseInterface): HTTP ответ от API +- `$requestUrl` (string|null): Полный URL запроса для валидации (опционально) **Возвращает:** `array` Декодированные данные ответа **Исключения:** -* `KinopoiskDevException`: При ошибках обработки ответа -* `KinopoiskResponseException`: При ошибках API (401, 403, 404, 500) -* `\JsonException`: При ошибках парсинга JSON +- `KinopoiskDevException`: При ошибках обработки ответа +- `KinopoiskResponseException`: При ошибках API (401, 403, 404, 500) +- `\JsonException`: При ошибках парсинга JSON **Пример:** + ```php $response = $kinopoisk->makeRequest('GET', 'movie/123'); $data = $kinopoisk->parseResponse($response); @@ -259,12 +263,12 @@ $movie = Movie::fromArray($data); **Параметры:** -* `$statusCode` (HttpStatusCode|null): Статус код как enum -* `$rawStatusCode` (int|null): Сырой статус код +- `$statusCode` (HttpStatusCode|null): Статус код как enum +- `$rawStatusCode` (int|null): Сырой статус код **Исключения:** -* `KinopoiskResponseException`: При известных ошибках API +- `KinopoiskResponseException`: При известных ошибках API ## `validateResponse()` @@ -272,5 +276,4 @@ $movie = Movie::fromArray($data); **Параметры:** -* `$requestUrl` (string): URL запроса - +- `$requestUrl` (string): URL запроса diff --git a/docs/dev/kinopoiskdev/Models/.nav.yml b/docs/dev/kinopoiskdev/Models/.nav.yml index d9592c2..dde3f44 100644 --- a/docs/dev/kinopoiskdev/Models/.nav.yml +++ b/docs/dev/kinopoiskdev/Models/.nav.yml @@ -1,5 +1,6 @@ title: Модели nav: + - "index.md" - "*" sort: type: alphabetical diff --git a/docs/dev/kinopoiskdev/Models/index.md b/docs/dev/kinopoiskdev/Models/index.md new file mode 100644 index 0000000..196461f --- /dev/null +++ b/docs/dev/kinopoiskdev/Models/index.md @@ -0,0 +1,684 @@ +--- +title: Модели +description: Система моделей KinopoiskDev для типизированных объектов данных API +keywords: модели, models, movie, person, image, данные, типизация +category: models +tags: + - Kinopoisk + - models +--- + +# Модели + +Система моделей KinopoiskDev предоставляет типизированные классы для представления всех структур данных API kinopoisk.dev. Все модели основаны на объектно-ориентированном подходе с использованием PHP 8.3+ атрибутов для валидации и сериализации. + +## Обзор + +Модели в KinopoiskDev используются для: + +- **Типизации данных** - строгая типизация всех структур API +- **Валидации** - автоматическая проверка данных через атрибуты +- **Сериализации** - преобразование между JSON и объектами +- **Безопасности** - контроль доступа к конфиденциальным данным + +## Доступные модели + +### Основные модели + +#### Movie + +**Файл:** [Movie.md](Movie.md) + +Основная модель для представления фильмов и сериалов: + +```php +class Movie extends BaseModel { + #[ApiField(name: 'id')] + #[Validation(required: true)] + public int $id; + + #[ApiField(name: 'name')] + #[Validation(required: true, maxLength: 255)] + public string $name; + + #[ApiField(name: 'year')] + #[Validation(min: 1888, max: 2030)] + public int $year; + + #[ApiField(name: 'rating')] + public Rating $rating; + + #[ApiField(name: 'persons')] + public array $persons; +} +``` + +**Возможности:** + +- Полная информация о фильме +- Вложенные объекты (Rating, Votes, Persons) +- Массивы связанных данных +- Автоматическая валидация + +#### Person + +**Файл:** [Person.md](Person.md) + +Модель для представления персон в кинематографе: + +```php +class Person extends BaseModel { + #[ApiField(name: 'id')] + #[Validation(required: true)] + public int $id; + + #[ApiField(name: 'name')] + #[Validation(required: true, maxLength: 255)] + public string $name; + + #[ApiField(name: 'profession')] + public PersonProfession $profession; + + #[ApiField(name: 'movies')] + public array $movies; +} +``` + +**Возможности:** + +- Информация о персоне +- Профессиональные данные +- Фильмография +- Биографическая информация + +#### SearchMovie + +**Файл:** [SearchMovie.md](SearchMovie.md) + +Модель для результатов поиска фильмов: + +```php +class SearchMovie extends BaseModel { + #[ApiField(name: 'id')] + public int $id; + + #[ApiField(name: 'name')] + public string $name; + + #[ApiField(name: 'year')] + public int $year; + + #[ApiField(name: 'rating')] + public Rating $rating; +} +``` + +**Возможности:** + +- Краткая информация для поиска +- Оптимизированная структура +- Быстрая загрузка + +### Модели рейтингов и голосов + +#### Rating + +**Файл:** [Rating.md](Rating.md) + +Модель для представления рейтингов фильмов: + +```php +class Rating extends BaseModel { + #[ApiField(name: 'kp')] + public float $kp; + + #[ApiField(name: 'imdb')] + public float $imdb; + + #[ApiField(name: 'tmdb')] + public float $tmdb; + + #[ApiField(name: 'filmCritics')] + public float $filmCritics; +} +``` + +**Возможности:** + +- Рейтинги различных платформ +- Поддержка всех источников +- Типизированные значения + +#### Votes + +**Файл:** [Votes.md](Votes.md) + +Модель для представления количества голосов: + +```php +class Votes extends BaseModel { + #[ApiField(name: 'kp')] + public int $kp; + + #[ApiField(name: 'imdb')] + public int $imdb; + + #[ApiField(name: 'tmdb')] + public int $tmdb; + + #[ApiField(name: 'filmCritics')] + public int $filmCritics; +} +``` + +**Возможности:** + +- Количество голосов по платформам +- Статистическая информация +- Валидация числовых значений + +### Модели изображений + +#### Image + +**Файл:** [Image.md](Image.md) + +Модель для представления изображений: + +```php +class Image extends BaseModel { + #[ApiField(name: 'url')] + public string $url; + + #[ApiField(name: 'previewUrl')] + public string $previewUrl; + + #[ApiField(name: 'width')] + public int $width; + + #[ApiField(name: 'height')] + public int $height; +} +``` + +**Возможности:** + +- URL изображений +- Размеры и разрешения +- Предварительные изображения + +#### ShortImage + +**Файл:** [ShortImage.md](ShortImage.md) + +Краткая модель изображения: + +```php +class ShortImage extends BaseModel { + #[ApiField(name: 'url')] + public string $url; + + #[ApiField(name: 'previewUrl')] + public string $previewUrl; +} +``` + +**Возможности:** + +- Минимальная информация +- Быстрая загрузка +- Оптимизация для списков + +### Модели персон в фильмах + +#### PersonInMovie + +**Файл:** [PersonInMovie.md](PersonInMovie.md) + +Модель для представления персоны в контексте фильма: + +```php +class PersonInMovie extends BaseModel { + #[ApiField(name: 'id')] + public int $id; + + #[ApiField(name: 'name')] + public string $name; + + #[ApiField(name: 'profession')] + public PersonProfession $profession; + + #[ApiField(name: 'description')] + public string $description; +} +``` + +**Возможности:** + +- Связь персоны с фильмом +- Профессиональная информация +- Описание роли + +#### MovieInPerson + +**Файл:** [MovieInPerson.md](MovieInPerson.md) + +Модель для представления фильма в контексте персоны: + +```php +class MovieInPerson extends BaseModel { + #[ApiField(name: 'id')] + public int $id; + + #[ApiField(name: 'name')] + public string $name; + + #[ApiField(name: 'rating')] + public float $rating; + + #[ApiField(name: 'general')] + public bool $general; +} +``` + +**Возможности:** + +- Связь фильма с персоной +- Рейтинговая информация +- Общая информация + +### Модели отзывов + +#### Review + +**Файл:** [Review.md](Review.md) + +Модель для представления отзывов: + +```php +class Review extends BaseModel { + #[ApiField(name: 'id')] + public int $id; + + #[ApiField(name: 'title')] + public string $title; + + #[ApiField(name: 'type')] + public ReviewType $type; + + #[ApiField(name: 'review')] + public string $review; + + #[ApiField(name: 'author')] + public string $author; +} +``` + +**Возможности:** + +- Полная информация об отзыве +- Типизация отзывов +- Авторская информация + +#### ReviewInfo + +**Файл:** [ReviewInfo.md](ReviewInfo.md) + +Краткая информация об отзыве: + +```php +class ReviewInfo extends BaseModel { + #[ApiField(name: 'id')] + public int $id; + + #[ApiField(name: 'title')] + public string $title; + + #[ApiField(name: 'type')] + public ReviewType $type; +} +``` + +**Возможности:** + +- Минимальная информация +- Быстрая загрузка +- Списки отзывов + +### Модели сезонов + +#### Season + +**Файл:** [Season.md](Season.md) + +Модель для представления сезонов сериалов: + +```php +class Season extends BaseModel { + #[ApiField(name: 'number')] + public int $number; + + #[ApiField(name: 'episodes')] + public array $episodes; + + #[ApiField(name: 'episodesCount')] + public int $episodesCount; +} +``` + +**Возможности:** + +- Информация о сезоне +- Список эпизодов +- Статистика + +#### Episode + +**Файл:** [Episode.md](Episode.md) + +Модель для представления эпизодов: + +```php +class Episode extends BaseModel { + #[ApiField(name: 'number')] + public int $number; + + #[ApiField(name: 'name')] + public string $name; + + #[ApiField(name: 'description')] + public string $description; +} +``` + +**Возможности:** + +- Информация об эпизоде +- Описание сюжета +- Нумерация + +### Модели студий + +#### Studio + +**Файл:** [Studio.md](Studio.md) + +Модель для представления студий: + +```php +class Studio extends BaseModel { + #[ApiField(name: 'id')] + public int $id; + + #[ApiField(name: 'name')] + public string $name; + + #[ApiField(name: 'type')] + public StudioType $type; + + #[ApiField(name: 'movies')] + public array $movies; +} +``` + +**Возможности:** + +- Информация о студии +- Тип студии +- Связанные фильмы + +### Модели наград + +#### MovieAward + +**Файл:** [MovieAward.md](MovieAward.md) + +Модель для представления наград фильмов: + +```php +class MovieAward extends BaseModel { + #[ApiField(name: 'nomination')] + public Nomination $nomination; + + #[ApiField(name: 'winning')] + public bool $winning; +} +``` + +**Возможности:** + +- Номинации и победы +- Детальная информация +- Статус награды + +#### PersonAward + +**Файл:** [PersonAward.md](PersonAward.md) + +Модель для представления наград персон: + +```php +class PersonAward extends BaseModel { + #[ApiField(name: 'nomination')] + public Nomination $nomination; + + #[ApiField(name: 'winning')] + public bool $winning; +} +``` + +**Возможности:** + +- Награды персон +- Номинации +- Статус награды + +### Вспомогательные модели + +#### Name + +**Файл:** [Name.md](Name.md) + +Модель для представления названий: + +```php +class Name extends BaseModel { + #[ApiField(name: 'name')] + public string $name; + + #[ApiField(name: 'language')] + public string $language; +} +``` + +**Возможности:** + +- Многоязычные названия +- Поддержка локализации +- Языковые метки + +#### ExternalId + +**Файл:** [ExternalId.md](ExternalId.md) + +Модель для внешних идентификаторов: + +```php +class ExternalId extends BaseModel { + #[ApiField(name: 'imdb')] + public string $imdb; + + #[ApiField(name: 'tmdb')] + public int $tmdb; +} +``` + +**Возможности:** + +- Связи с внешними системами +- Кросс-платформенные ID +- Интеграция с другими API + +## Использование + +### Создание моделей из API данных + +```php + 301, + 'name' => 'Матрица', + 'year' => 1999, + 'rating' => ['kp' => 8.7, 'imdb' => 8.7] +]; + +$movie = Movie::fromArray($movieData); + +// Доступ к свойствам +echo $movie->name; // "Матрица" +echo $movie->year; // 1999 +echo $movie->rating->kp; // 8.7 +``` + +### Валидация моделей + +```php +// Автоматическая валидация при создании +try { + $movie = Movie::fromArray($data); + $movie->validate(); // Проверка всех атрибутов валидации +} catch (ValidationException $e) { + echo "Ошибки валидации: " . implode(', ', $e->getErrors()); +} +``` + +### Сериализация моделей + +```php +// Преобразование в массив +$array = $movie->toArray(); + +// Преобразование в JSON +$json = $movie->toJson(); + +// Скрытие конфиденциальных данных +$movie->apiToken = 'secret-token'; +$array = $movie->toArray(); // apiToken будет скрыт +``` + +### Работа с вложенными объектами + +```php +// Автоматическое создание вложенных объектов +$movieData = [ + 'id' => 301, + 'name' => 'Матрица', + 'rating' => ['kp' => 8.7, 'imdb' => 8.7], + 'persons' => [ + ['id' => 1, 'name' => 'Киану Ривз', 'profession' => 'actor'], + ['id' => 2, 'name' => 'Лана Вачовски', 'profession' => 'director'] + ] +]; + +$movie = Movie::fromArray($movieData); + +// Доступ к вложенным объектам +echo $movie->rating->kp; // 8.7 +echo $movie->persons[0]->name; // "Киану Ривз" +echo $movie->persons[0]->profession; // PersonProfession::ACTOR +``` + +## Интеграция с атрибутами + +### Автоматическая валидация + +```php +class Movie extends BaseModel { + #[Validation(required: true, maxLength: 255)] + public string $name; + + #[Validation(min: 1888, max: 2030)] + public int $year; + + #[Validation(pattern: '/^[a-zA-Z0-9\s]+$/')] + public string $genre; +} + +// Валидация происходит автоматически +$movie = Movie::fromArray($data); +$movie->validate(); // Проверка всех атрибутов +``` + +### Контроль сериализации + +```php +class ApiConfig extends BaseModel { + #[Sensitive(hideInJson: true, hideInArray: true)] + public string $apiToken; + + #[ApiField(name: 'config_name')] + public string $name; +} + +$config = new ApiConfig(); +$config->apiToken = 'secret-token'; +$config->name = 'Production Config'; + +$array = $config->toArray(); +// apiToken будет скрыт, name будет как 'config_name' +``` + +## Связанные разделы + +- **[Attributes](../Attributes/)** - атрибуты валидации и сериализации +- **[Exceptions](../Exceptions/)** - исключения валидации +- **[Http](../Http/)** - HTTP запросы, возвращающие модели +- **[Responses](../Responses/)** - классы ответов API + +## Преимущества + +### Типобезопасность + +```php +// Строгая типизация всех свойств +$movie = Movie::fromArray($data); +$movie->name; // string +$movie->year; // int +$movie->rating->kp; // float +$movie->persons; // array +``` + +### Автоматическая валидация + +```php +// Валидация через атрибуты +#[Validation(required: true, maxLength: 255)] +public string $name; + +#[Validation(min: 1888, max: 2030)] +public int $year; +``` + +### Безопасность данных + +```php +// Автоматическое скрытие конфиденциальных данных +#[Sensitive(hideInJson: true)] +public string $apiToken; +``` + +## Полезные ссылки + +- **[Attributes](../Attributes/)** - атрибуты валидации +- **[Exceptions](../Exceptions/)** - исключения валидации +- **[Http](../Http/)** - HTTP запросы +- **[Responses](../Responses/)** - классы ответов + +--- + +**Модели KinopoiskDev** - обеспечивают типобезопасность и валидацию данных с автоматической сериализацией. diff --git a/docs/dev/kinopoiskdev/Responses/.nav.yml b/docs/dev/kinopoiskdev/Responses/.nav.yml index 24186ea..69258b6 100644 --- a/docs/dev/kinopoiskdev/Responses/.nav.yml +++ b/docs/dev/kinopoiskdev/Responses/.nav.yml @@ -1,7 +1,8 @@ title: Ответы API nav: - - BaseDocsResponseDto: BaseDocsResponseDto.md - - BaseResponseDto: BaseResponseDto.md - - ErrorResponseDto: ErrorResponseDto.md + - "index.md" + - "*" - API ответы: Api/ - - Ошибки: Errors/ \ No newline at end of file + - Ошибки: Errors/ +sort: + type: alphabetical diff --git a/docs/dev/kinopoiskdev/Responses/Api/.nav.yml b/docs/dev/kinopoiskdev/Responses/Api/.nav.yml index d8f7a11..8c91325 100644 --- a/docs/dev/kinopoiskdev/Responses/Api/.nav.yml +++ b/docs/dev/kinopoiskdev/Responses/Api/.nav.yml @@ -1,5 +1,6 @@ title: API ответы nav: + - "index.md" - "*" sort: type: alphabetical diff --git a/docs/dev/kinopoiskdev/Responses/Api/index.md b/docs/dev/kinopoiskdev/Responses/Api/index.md new file mode 100644 index 0000000..38b145c --- /dev/null +++ b/docs/dev/kinopoiskdev/Responses/Api/index.md @@ -0,0 +1,167 @@ +--- +title: API ответы +description: DTO классы для представления структурированных ответов API Kinopoisk.dev с поддержкой пагинации +keywords: api ответы, dto, пагинация, структурированные данные, movie, person, image +category: responses-api +tags: + - Kinopoisk + - responses + - dto + - API +--- + +# API ответы + +DTO классы для представления структурированных ответов API Kinopoisk.dev с поддержкой пагинации. + +## ImageDocsResponseDto + +DTO ответа для результатов поиска изображений с пагинацией. Предоставляет структурированный доступ к результатам поиска изображений с поддержкой фильтрации и сортировки. + +**Основные возможности:** + +- Представление результатов поиска изображений +- Поддержка пагинации и метаданных +- Безопасное преобразование данных в объекты Image +- Специализированные методы для работы с изображениями + +## KeywordDocsResponseDto + +DTO для ответа API с ключевыми словами. Представляет структурированный ответ при запросе списка ключевых слов с поддержкой пагинации. + +**Основные возможности:** + +- Представление коллекции ключевых слов +- Фильтрация по популярности и поиск по названию +- Группировка по количеству связанных фильмов +- Статистика и анализ ключевых слов + +## ListDocsResponseDto + +DTO для ответа API с коллекциями фильмов. Представляет структурированный ответ при запросе списка коллекций фильмов с поддержкой пагинации. + +**Основные возможности:** + +- Представление коллекций фильмов +- Фильтрация по категориям +- Получение популярных коллекций +- Управление метаданными пагинации + +## MovieAwardDocsResponseDto + +DTO для представления ответа API с наградами фильмов и информацией о пагинации. Расширяет базовый класс для специализированной работы с коллекциями наград фильмов. + +**Основные возможности:** + +- Представление наград фильмов +- Безопасное преобразование в объекты MovieAward +- Поддержка пагинации результатов +- Стандартизированный интерфейс для работы с наградами + +## MovieDocsResponseDto + +Объект-контейнер для ответа API с данными о фильмах и информацией о пагинации. Представляет стандартный ответ для запросов, возвращающих коллекцию фильмов. + +**Основные возможности:** + +- Представление коллекции фильмов +- Метаданные для постраничной навигации +- Стандартизированная структура ответа +- Совместимость с API Kinopoisk.dev + +## PersonAwardDocsResponseDto + +DTO для результатов поиска наград персон с пагинацией. Специализируется на работе с коллекцией объектов PersonAward. + +**Основные возможности:** + +- Представление наград персон +- Типизированный доступ к данным наград +- Поддержка пагинации результатов +- Безопасное преобразование данных + +## PersonDocsResponseDto + +DTO ответа для результатов поиска персон с пагинацией. Специализируется на работе с коллекцией объектов Person. + +**Основные возможности:** + +- Представление коллекции персон +- Типизированный доступ к данным персон +- Поддержка пагинации результатов +- Безопасное преобразование в объекты Person + +## PossibleValueDto + +Класс для представления возможного значения поля. Представляет информацию о возможном значении для определенного поля API. + +**Основные возможности:** + +- Представление возможных значений полей +- Поддержка значения и вспомогательного slug +- Использование для фильтрации по полям +- Строковое представление для удобства + +## ReviewDocsResponseDto + +DTO ответа для результатов поиска рецензий с пагинацией. Специализируется на работе с коллекцией объектов Review. + +**Основные возможности:** + +- Представление коллекции рецензий +- Типизированный доступ к данным рецензий +- Поддержка пагинации результатов +- Безопасное преобразование в объекты Review + +## SearchMovieResponseDto + +Объект-контейнер для ответа API с данными о фильмах и информацией о пагинации. Представляет стандартный ответ для поисковых запросов фильмов. + +**Основные возможности:** + +- Представление результатов поиска фильмов +- Преобразование в объекты SearchMovie +- Поддержка пагинации результатов +- Стандартизированная структура ответа + +## SearchPersonResponseDto + +Объект-контейнер для ответа API с данными о персонах и информацией о пагинации. Представляет стандартный ответ для поисковых запросов персон. + +**Основные возможности:** + +- Представление результатов поиска персон +- Преобразование в объекты SearchMovie +- Поддержка пагинации результатов +- Стандартизированная структура ответа + +## SearchStudioResponseDto + +DTO для ответа API с результатами поиска студий. Представляет структурированный ответ при поиске студий. + +**Основные возможности:** + +- Представление результатов поиска студий +- Поддержка пагинации результатов +- Стандартизированная структура ответа + +## SeasonDocsResponseDto + +DTO ответа для результатов поиска сезонов с пагинацией. Специализируется на работе с коллекцией объектов Season. + +**Основные возможности:** + +- Представление коллекции сезонов +- Типизированный доступ к данным сезонов +- Поддержка пагинации результатов +- Безопасное преобразование в объекты Season + +## StudioDocsResponseDto + +DTO для ответа API с данными о студиях. Представляет структурированный ответ при работе со студиями. + +**Основные возможности:** + +- Представление данных о студиях +- Фабричные методы для создания из массива +- Стандартизированная структура ответа diff --git a/docs/dev/kinopoiskdev/Responses/Errors/.nav.yml b/docs/dev/kinopoiskdev/Responses/Errors/.nav.yml index 528b95a..aac98a8 100644 --- a/docs/dev/kinopoiskdev/Responses/Errors/.nav.yml +++ b/docs/dev/kinopoiskdev/Responses/Errors/.nav.yml @@ -1,5 +1,6 @@ title: Ошибки nav: + - "index.md" - "*" sort: type: alphabetical diff --git a/docs/dev/kinopoiskdev/Responses/Errors/index.md b/docs/dev/kinopoiskdev/Responses/Errors/index.md new file mode 100644 index 0000000..95a176b --- /dev/null +++ b/docs/dev/kinopoiskdev/Responses/Errors/index.md @@ -0,0 +1,47 @@ +--- +title: Ошибки +description: DTO классы для представления различных типов ошибок API Kinopoisk.dev +keywords: ошибки, errors, dto, http статусы, обработка ошибок +category: responses-errors +tags: + - Kinopoisk + - responses + - errors +--- + +# Ошибки + +DTO классы для представления различных типов ошибок API Kinopoisk.dev. + +## ForbiddenErrorResponseDto + +DTO для представления ответа с ошибкой доступа запрещен (HTTP 403). Возникает при превышении дневного лимита запросов к API. + +**Основные возможности:** + +- Представление ошибки 403 Forbidden +- Обработка превышения дневного лимита запросов +- Неизменяемые свойства для обеспечения целостности данных +- Фабричные методы для создания из массива данных + +## NotFoundErrorResponseDto + +DTO для представления ответа с ошибкой "не найдено" (HTTP 404). Возникает когда запрошенный ресурс не найден или лимит запросов превышен. + +**Основные возможности:** + +- Представление ошибки 404 Not Found +- Обработка отсутствующих ресурсов +- Обработка превышения лимита запросов +- Стандартизированная структура ответа об ошибке + +## UnauthorizedErrorResponseDto + +DTO для представления ответа об ошибке авторизации API (HTTP 401). Возникает при отсутствии или недействительности токена доступа. + +**Основные возможности:** + +- Представление ошибки 401 Unauthorized +- Обработка отсутствующих или недействительных токенов +- Предустановленные значения для типичных ошибок авторизации +- Специализированная обработка ошибок доступа diff --git a/docs/dev/kinopoiskdev/Responses/index.md b/docs/dev/kinopoiskdev/Responses/index.md new file mode 100644 index 0000000..5ebc50f --- /dev/null +++ b/docs/dev/kinopoiskdev/Responses/index.md @@ -0,0 +1,655 @@ +--- +title: Ответы API +description: Система ответов API KinopoiskDev для структурированной обработки данных +keywords: ответы, responses, api, dto, структурированные данные +category: responses +tags: + - Kinopoisk + - responses + - dto +--- + +# Ответы API + +Система ответов KinopoiskDev предоставляет типизированные классы для обработки всех типов ответов от API kinopoisk.dev. Все классы ответов основаны на объектно-ориентированном подходе с полной типизацией и автоматической обработкой данных. + +## Обзор + +Ответы API в KinopoiskDev используются для: + +- **Типизации ответов** - строгая типизация всех структур ответов API +- **Обработки данных** - автоматическое преобразование JSON в объекты +- **Валидации** - проверка корректности ответов от API +- **Обработки ошибок** - специализированные классы для ошибок + +## Доступные классы ответов + +### Базовые классы + +#### BaseResponseDto + +**Файл:** [BaseResponseDto.md](BaseResponseDto.md) + +Базовый класс для всех ответов API: + +```php +class BaseResponseDto extends BaseModel { + #[ApiField(name: 'status')] + public int $status; + + #[ApiField(name: 'message')] + public string $message; + + #[ApiField(name: 'timestamp')] + public string $timestamp; +} +``` + +**Возможности:** + +- Базовые поля всех ответов +- Статус и сообщения +- Временные метки +- Общая структура + +#### BaseDocsResponseDto + +**Файл:** [BaseDocsResponseDto.md](BaseDocsResponseDto.md) + +Базовый класс для ответов с документами: + +```php +class BaseDocsResponseDto extends BaseResponseDto { + #[ApiField(name: 'docs')] + public array $docs; + + #[ApiField(name: 'total')] + public int $total; + + #[ApiField(name: 'limit')] + public int $limit; + + #[ApiField(name: 'page')] + public int $page; + + #[ApiField(name: 'pages')] + public int $pages; +} +``` + +**Возможности:** + +- Пагинация результатов +- Общее количество документов +- Лимиты и страницы +- Массивы документов + +#### ErrorResponseDto + +**Файл:** [ErrorResponseDto.md](ErrorResponseDto.md) + +Базовый класс для ответов с ошибками: + +```php +class ErrorResponseDto extends BaseResponseDto { + #[ApiField(name: 'error')] + public string $error; + + #[ApiField(name: 'errorCode')] + public int $errorCode; + + #[ApiField(name: 'details')] + public array $details; +} +``` + +**Возможности:** + +- Информация об ошибках +- Коды ошибок +- Детали ошибок +- Обработка исключений + +### API ответы + +#### MovieDocsResponseDto + +**Файл:** [Api/MovieDocsResponseDto.md](Api/MovieDocsResponseDto.md) + +Ответ для поиска фильмов: + +```php +class MovieDocsResponseDto extends BaseDocsResponseDto { + #[ApiField(name: 'docs')] + public array $docs; // array +} +``` + +**Возможности:** + +- Массив фильмов +- Пагинация +- Метаданные поиска + +#### PersonDocsResponseDto + +**Файл:** [Api/PersonDocsResponseDto.md](Api/PersonDocsResponseDto.md) + +Ответ для поиска персон: + +```php +class PersonDocsResponseDto extends BaseDocsResponseDto { + #[ApiField(name: 'docs')] + public array $docs; // array +} +``` + +**Возможности:** + +- Массив персон +- Пагинация +- Метаданные поиска + +#### SearchMovieResponseDto + +**Файл:** [Api/SearchMovieResponseDto.md](Api/SearchMovieResponseDto.md) + +Ответ для поиска фильмов с краткой информацией: + +```php +class SearchMovieResponseDto extends BaseDocsResponseDto { + #[ApiField(name: 'docs')] + public array $docs; // array +} +``` + +**Возможности:** + +- Краткая информация о фильмах +- Оптимизированная структура +- Быстрая загрузка + +#### SearchPersonResponseDto + +**Файл:** [Api/SearchPersonResponseDto.md](Api/SearchPersonResponseDto.md) + +Ответ для поиска персон с краткой информацией: + +```php +class SearchPersonResponseDto extends BaseDocsResponseDto { + #[ApiField(name: 'docs')] + public array $docs; // array +} +``` + +**Возможности:** + +- Краткая информация о персонах +- Оптимизированная структура +- Быстрая загрузка + +#### ImageDocsResponseDto + +**Файл:** [Api/ImageDocsResponseDto.md](Api/ImageDocsResponseDto.md) + +Ответ для получения изображений: + +```php +class ImageDocsResponseDto extends BaseDocsResponseDto { + #[ApiField(name: 'docs')] + public array $docs; // array +} +``` + +**Возможности:** + +- Массив изображений +- Метаданные изображений +- Фильтрация по типам + +#### KeywordDocsResponseDto + +**Файл:** [Api/KeywordDocsResponseDto.md](Api/KeywordDocsResponseDto.md) + +Ответ для поиска ключевых слов: + +```php +class KeywordDocsResponseDto extends BaseDocsResponseDto { + #[ApiField(name: 'docs')] + public array $docs; // array +} +``` + +**Возможности:** + +- Массив ключевых слов +- Метаданные поиска +- Фильтрация по популярности + +#### ReviewDocsResponseDto + +**Файл:** [Api/ReviewDocsResponseDto.md](Api/ReviewDocsResponseDto.md) + +Ответ для поиска отзывов: + +```php +class ReviewDocsResponseDto extends BaseDocsResponseDto { + #[ApiField(name: 'docs')] + public array $docs; // array +} +``` + +**Возможности:** + +- Массив отзывов +- Типизация отзывов +- Метаданные поиска + +#### SeasonDocsResponseDto + +**Файл:** [Api/SeasonDocsResponseDto.md](Api/SeasonDocsResponseDto.md) + +Ответ для получения сезонов: + +```php +class SeasonDocsResponseDto extends BaseDocsResponseDto { + #[ApiField(name: 'docs')] + public array $docs; // array +} +``` + +**Возможности:** + +- Массив сезонов +- Информация об эпизодах +- Метаданные сериала + +#### StudioDocsResponseDto + +**Файл:** [Api/StudioDocsResponseDto.md](Api/StudioDocsResponseDto.md) + +Ответ для поиска студий: + +```php +class StudioDocsResponseDto extends BaseDocsResponseDto { + #[ApiField(name: 'docs')] + public array $docs; // array +} +``` + +**Возможности:** + +- Массив студий +- Типы студий +- Метаданные поиска + +#### ListDocsResponseDto + +**Файл:** [Api/ListDocsResponseDto.md](Api/ListDocsResponseDto.md) + +Ответ для получения списков: + +```php +class ListDocsResponseDto extends BaseDocsResponseDto { + #[ApiField(name: 'docs')] + public array $docs; // array +} +``` + +**Возможности:** + +- Массив списков +- Категории списков +- Метаданные + +#### MovieAwardDocsResponseDto + +**Файл:** [Api/MovieAwardDocsResponseDto.md](Api/MovieAwardDocsResponseDto.md) + +Ответ для получения наград фильмов: + +```php +class MovieAwardDocsResponseDto extends BaseDocsResponseDto { + #[ApiField(name: 'docs')] + public array $docs; // array +} +``` + +**Возможности:** + +- Массив наград +- Номинации и победы +- Метаданные наград + +#### PersonAwardDocsResponseDto + +**Файл:** [Api/PersonAwardDocsResponseDto.md](Api/PersonAwardDocsResponseDto.md) + +Ответ для получения наград персон: + +```php +class PersonAwardDocsResponseDto extends BaseDocsResponseDto { + #[ApiField(name: 'docs')] + public array $docs; // array +} +``` + +**Возможности:** + +- Массив наград персон +- Номинации и победы +- Метаданные наград + +#### SearchStudioResponseDto + +**Файл:** [Api/SearchStudioResponseDto.md](Api/SearchStudioResponseDto.md) + +Ответ для поиска студий: + +```php +class SearchStudioResponseDto extends BaseDocsResponseDto { + #[ApiField(name: 'docs')] + public array $docs; // array +} +``` + +**Возможности:** + +- Массив студий +- Типы студий +- Метаданные поиска + +#### PossibleValueDto + +**Файл:** [Api/PossibleValueDto.md](Api/PossibleValueDto.md) + +Ответ для получения возможных значений: + +```php +class PossibleValueDto extends BaseResponseDto { + #[ApiField(name: 'values')] + public array $values; +} +``` + +**Возможности:** + +- Возможные значения полей +- Справочная информация +- Валидация параметров + +### Классы ошибок + +#### UnauthorizedErrorResponseDto + +**Файл:** [Errors/UnauthorizedErrorResponseDto.md](Errors/UnauthorizedErrorResponseDto.md) + +Ответ для ошибки 401 (Неавторизован): + +```php +class UnauthorizedErrorResponseDto extends ErrorResponseDto { + #[ApiField(name: 'error')] + public string $error = 'Unauthorized'; + + #[ApiField(name: 'errorCode')] + public int $errorCode = 401; +} +``` + +**Возможности:** + +- Обработка ошибок авторизации +- Неверные API ключи +- Истекшие токены + +#### ForbiddenErrorResponseDto + +**Файл:** [Errors/ForbiddenErrorResponseDto.md](Errors/ForbiddenErrorResponseDto.md) + +Ответ для ошибки 403 (Запрещено): + +```php +class ForbiddenErrorResponseDto extends ErrorResponseDto { + #[ApiField(name: 'error')] + public string $error = 'Forbidden'; + + #[ApiField(name: 'errorCode')] + public int $errorCode = 403; +} +``` + +**Возможности:** + +- Обработка ошибок доступа +- Недостаточные права +- Блокировка запросов + +#### NotFoundErrorResponseDto + +**Файл:** [Errors/NotFoundErrorResponseDto.md](Errors/NotFoundErrorResponseDto.md) + +Ответ для ошибки 404 (Не найдено): + +```php +class NotFoundErrorResponseDto extends ErrorResponseDto { + #[ApiField(name: 'error')] + public string $error = 'Not Found'; + + #[ApiField(name: 'errorCode')] + public int $errorCode = 404; +} +``` + +**Возможности:** + +- Обработка ошибок поиска +- Несуществующие ресурсы +- Неверные ID + +## Использование + +### Обработка успешных ответов + +```php +status; // 200 +echo $response->total; // 100 +echo count($response->docs); // количество фильмов + +// Работа с документами +foreach ($response->docs as $movie) { + echo $movie->name . " (" . $movie->year . ")\n"; +} +``` + +### Обработка ошибок + +```php +error; // "Unauthorized" +echo $error->errorCode; // 401 + +// Обработка ошибки поиска +$notFoundJson = '{"status":404,"error":"Not Found","errorCode":404}'; +$notFound = NotFoundErrorResponseDto::fromArray(json_decode($notFoundJson, true)); + +echo $notFound->error; // "Not Found" +``` + +### Работа с пагинацией + +```php +total . "\n"; +echo "На странице: " . $response->limit . "\n"; +echo "Текущая страница: " . $response->page . "\n"; +echo "Всего страниц: " . $response->pages . "\n"; + +// Проверка наличия следующей страницы +if ($response->page < $response->pages) { + echo "Есть следующая страница\n"; +} + +// Получение документов +$movies = $response->docs; +foreach ($movies as $movie) { + echo $movie->name . "\n"; +} +``` + +### Автоматическая обработка в HTTP запросах + +```php +searchMovies($filter); + // Автоматически создается MovieDocsResponseDto + + foreach ($response->docs as $movie) { + echo $movie->name . "\n"; + } + +} catch (KinopoiskResponseException $e) { + if ($e->getCode() === 401) { + // Автоматически создается UnauthorizedErrorResponseDto + echo "Ошибка авторизации: " . $e->getMessage(); + } +} +``` + +## Интеграция с исключениями + +### Автоматическое создание исключений + +```php +getMessage(); // "Unauthorized" +echo $exception->getCode(); // 401 +``` + +### Обработка различных типов ошибок + +```php +try { + $response = $requests->getMovieById(999999); +} catch (KinopoiskResponseException $e) { + switch ($e->getCode()) { + case 401: + // UnauthorizedErrorResponseDto + echo "Неверный API ключ"; + break; + case 403: + // ForbiddenErrorResponseDto + echo "Доступ запрещен"; + break; + case 404: + // NotFoundErrorResponseDto + echo "Фильм не найден"; + break; + default: + echo "Ошибка API: " . $e->getMessage(); + } +} +``` + +## Связанные разделы + +- **[Models](../Models/)** - модели данных в ответах +- **[Exceptions](../Exceptions/)** - исключения для обработки ошибок +- **[Http](../Http/)** - HTTP запросы, возвращающие ответы +- **[Attributes](../Attributes/)** - атрибуты для валидации ответов + +## Преимущества + +### Типобезопасность + +```php +// Строгая типизация всех ответов +$response = MovieDocsResponseDto::fromArray($data); +$response->docs; // array +$response->total; // int +$response->limit; // int +$response->page; // int +``` + +### Автоматическая обработка + +```php +// Автоматическое создание из JSON +$response = MovieDocsResponseDto::fromArray(json_decode($json, true)); + +// Автоматическая валидация +$response->validate(); + +// Автоматическое создание исключений +throw new KinopoiskResponseException(UnauthorizedErrorResponseDto::class); +``` + +### Единообразный интерфейс + +```php +// Все ответы имеют одинаковую структуру +$response->status; // Статус ответа +$response->message; // Сообщение +$response->timestamp; // Временная метка + +// Все ответы с документами поддерживают пагинацию +$response->docs; // Массив документов +$response->total; // Общее количество +$response->limit; // Лимит на страницу +$response->page; // Текущая страница +$response->pages; // Общее количество страниц +``` + +## Полезные ссылки + +- **[Models](../Models/)** - модели данных +- **[Exceptions](../Exceptions/)** - исключения +- **[Http](../Http/)** - HTTP запросы +- **[Attributes](../Attributes/)** - атрибуты валидации + +--- + +**Ответы API KinopoiskDev** - обеспечивают типобезопасность и автоматическую обработку всех ответов от API kinopoisk.dev. diff --git a/docs/dev/kinopoiskdev/Services/.nav.yml b/docs/dev/kinopoiskdev/Services/.nav.yml index af72fe9..424b275 100644 --- a/docs/dev/kinopoiskdev/Services/.nav.yml +++ b/docs/dev/kinopoiskdev/Services/.nav.yml @@ -1,4 +1,6 @@ title: Сервисы nav: - - CacheService: CacheService.md - - ValidationService: ValidationService.md + - "index.md" + - "*" +sort: + type: alphabetical diff --git a/docs/dev/kinopoiskdev/Services/index.md b/docs/dev/kinopoiskdev/Services/index.md new file mode 100644 index 0000000..069064b --- /dev/null +++ b/docs/dev/kinopoiskdev/Services/index.md @@ -0,0 +1,37 @@ +--- +title: Сервисы +description: Сервисные классы для расширенной функциональности KinopoiskDev PHP Wrapper +keywords: сервисы, services, кэш, валидация, cache, validation +category: services +tags: + - Kinopoisk + - services +--- + +# Сервисы + +Сервисные классы для расширенной функциональности KinopoiskDev PHP Wrapper. + +## CacheService + +Сервис для работы с кэшем, реализующий интерфейс кэширования с использованием PSR-6 Cache. Обеспечивает типобезопасную работу с различными драйверами кэша. + +**Основные возможности:** + +- Получение, сохранение и удаление данных из кэша +- Проверка существования ключей +- Массовые операции с кэшем +- Поддержка различных адаптеров (файловый, Redis) +- Автоматическая нормализация ключей для PSR-6 + +## ValidationService + +Сервис для валидации данных на основе атрибутов PHP 8.3. Выполняет декларативную валидацию объектов и массивов данных. + +**Основные возможности:** + +- Валидация объектов на основе атрибутов Validation +- Поддержка различных типов валидации (обязательные поля, длина, диапазоны) +- Валидация API токенов, HTTP методов, endpoints +- Специализированная валидация для фильмов, персон, жанров +- Валидация дат, рейтингов, поисковых запросов diff --git a/docs/dev/kinopoiskdev/Utils/.nav.yml b/docs/dev/kinopoiskdev/Utils/.nav.yml index fd7d713..54b2287 100644 --- a/docs/dev/kinopoiskdev/Utils/.nav.yml +++ b/docs/dev/kinopoiskdev/Utils/.nav.yml @@ -1,6 +1,6 @@ title: Утилиты nav: - - DataManager: DataManager.md - - FilterTrait: FilterTrait.md - - MovieFilter: MovieFilter.md - - SortManager: SortManager.md + - "index.md" + - "*" +sort: + type: alphabetical diff --git a/docs/dev/kinopoiskdev/Utils/index.md b/docs/dev/kinopoiskdev/Utils/index.md new file mode 100644 index 0000000..e3b505b --- /dev/null +++ b/docs/dev/kinopoiskdev/Utils/index.md @@ -0,0 +1,61 @@ +--- +title: Утилиты +description: Вспомогательные классы и трейты для работы с KinopoiskDev PHP Wrapper +keywords: утилиты, utils, datamanager, filtertrait, sortmanager, moviefilter +category: utils +tags: + - Kinopoisk + - utils + - filter + - traits +--- + +# Утилиты + +Вспомогательные классы и трейты для работы с KinopoiskDev PHP Wrapper. + +## DataManager + +Класс для управления данными и их преобразованиями. Предоставляет методы для работы с массивами объектов, парсинга данных из API и обработки enum значений. + +**Основные возможности:** + +- Преобразование объектов в массивы +- Автоматический парсинг объектов из API данных +- Обработка enum значений +- Валидация и безопасная обработка данных + +## FilterTrait + +Трейт с общими методами фильтрации, которые могут использоваться в различных классах фильтров. Следует принципу DRY, централизуя общую логику фильтрации. + +**Основные возможности:** + +- Фильтрация по ID, названию, типу +- Поиск по названию и описанию +- Фильтрация по рейтингу и диапазонам +- Возрастные фильтры и фильтры сезонов + +## MovieFilter + +Специализированный класс для создания фильтров при поиске фильмов через API Kinopoisk.dev. Предоставляет полный набор методов для фильтрации по всем доступным параметрам. + +**Основные возможности:** + +- Фильтрация по всем полям фильма +- Поддержка различных операторов сравнения +- Фильтрация по жанрам, странам, рейтингам +- Работа с датами и диапазонами +- Сортировка результатов + +## SortManager + +Трейт для добавления функциональности сортировки к фильтрам. Предоставляет методы для управления параметрами сортировки при выполнении запросов к API. + +**Основные возможности:** + +- Добавление и удаление критериев сортировки +- Переключение направления сортировки +- Множественная сортировка +- Экспорт и импорт критериев сортировки +- Предустановленные методы сортировки diff --git a/docs/dev/kinopoiskdev/README.md b/docs/dev/kinopoiskdev/index.md similarity index 90% rename from docs/dev/kinopoiskdev/README.md rename to docs/dev/kinopoiskdev/index.md index 3ec6db7..b99e96b 100644 --- a/docs/dev/kinopoiskdev/README.md +++ b/docs/dev/kinopoiskdev/index.md @@ -1,8 +1,21 @@ +--- +title: KinopoiskDev PHP Wrapper +description: Современная PHP библиотека для работы с API kinopoisk.dev - неофициальным API КиноПоиска +keywords: kinopoisk, api, php, wrapper, фильмы, кино, kinopoisk.dev +author: DevCraftClub +version: 1.0.0 +tags: + - Kinopoisk + - Wrapper + - PHP + - API +--- + # KinopoiskDev PHP Wrapper Современная PHP библиотека для работы с API [kinopoisk.dev](https://kinopoisk.dev) - неофициальным API КиноПоиска. -## 🚀 Особенности +## Особенности - **Современный подход** - использует PHP 8.3+ атрибуты и строгую типизацию - **Расширенные фильтры** - гибкая система фильтрации с поддержкой диапазонов @@ -11,13 +24,13 @@ - **Активная поддержка** - [Telegram группа](https://t.me/omdb_dev) с 7,908 участниками - **Модульная архитектура** - четкое разделение ответственности -## 📦 Установка +## Установка ```bash composer require devcraftclub/kinopoisk-dev-php ``` -## 🔧 Быстрый старт +## Быстрый старт ```php getMovieById(301); echo $movie->name; // "Матрица" ``` -## 🏗️ Архитектура +## Архитектура ### Основные компоненты @@ -68,7 +81,7 @@ KinopoiskDev/ └── Utils/ # Утилиты ``` -## 🔍 Возможности +## Возможности ### Поиск фильмов @@ -120,13 +133,13 @@ class Movie { } ``` -## 🛡️ Безопасность +## Безопасность - **Атрибут `#[Sensitive]`** - автоматическое скрытие конфиденциальных данных - **Валидация входных данных** - защита от некорректных параметров - **Типизированные модели** - предотвращение ошибок типов -## 📚 Документация +## Документация - **[Основной класс](Kinopoisk.md)** - главный клиент API - **[Атрибуты](Attributes/)** - валидация и конфигурация @@ -134,23 +147,23 @@ class Movie { - **[Модели](Models/)** - структуры данных - **[Исключения](Exceptions/)** - обработка ошибок -## 🔗 Полезные ссылки +## Полезные ссылки - **[kinopoisk.dev](https://kinopoisk.dev)** - официальный сайт API - **[Telegram группа](https://t.me/omdb_dev)** - активное сообщество (7,908 участников) - **[Сравнение с KinopoiskUnofficialTech](notkinopoiskphp-compare.md)** - различия между библиотеками -## 🤝 Поддержка +## Поддержка API - **Telegram**: [@omdb_dev](https://t.me/omdb_dev) - основная группа поддержки - **Email**: поддержка через Telegram группу - **Документация**: полная документация в этом разделе -## 📄 Лицензия +## Лицензия MIT License - см. файл [LICENSE](LICENSE) для деталей. -## 🆚 Сравнение с альтернативами +## Сравнение с альтернативами | Особенность | KinopoiskDev | KinopoiskUnofficialTech | | --------------- | -------------------------------------- | --------------------------- | @@ -161,7 +174,7 @@ MIT License - см. файл [LICENSE](LICENSE) для деталей. | **Валидация** | Автоматическая | Ручная | | **Фильтры** | Расширенные | Базовые | -## 🚀 Миграция +## Миграция Если вы используете KinopoiskUnofficialTech, см. [руководство по миграции](notkinopoiskphp-compare.md#миграция). diff --git a/docs/dev/notkinopoiskphp/.nav.yml b/docs/dev/notkinopoiskphp/.nav.yml index 05b7414..bcd000a 100644 --- a/docs/dev/notkinopoiskphp/.nav.yml +++ b/docs/dev/notkinopoiskphp/.nav.yml @@ -1,6 +1,6 @@ title: KinopoiskUnofficialTech PHP Wrapper nav: - - Главная: index.md + - "index.md" - Сравнение с KinopoiskDev: ../kinopoiskdev/notkinopoiskphp-compare.md - Клиент: client.md - Абстрактные классы: abstract-classes.md diff --git a/docs/dev/notkinopoiskphp/enums/.nav.yml b/docs/dev/notkinopoiskphp/enums/.nav.yml index 22a978e..29df1ed 100644 --- a/docs/dev/notkinopoiskphp/enums/.nav.yml +++ b/docs/dev/notkinopoiskphp/enums/.nav.yml @@ -1,6 +1,6 @@ title: Перечисления (Enums) nav: - - Оглавление: index.md + - index.md - "*" sort: type: alphabetical diff --git a/docs/dev/notkinopoiskphp/exceptions/.nav.yml b/docs/dev/notkinopoiskphp/exceptions/.nav.yml index af4d5d0..7a95974 100644 --- a/docs/dev/notkinopoiskphp/exceptions/.nav.yml +++ b/docs/dev/notkinopoiskphp/exceptions/.nav.yml @@ -1,6 +1,6 @@ title: Исключения (Exceptions) nav: - - Оглавление: index.md + - index.md - "*" sort: type: alphabetical diff --git a/docs/dev/notkinopoiskphp/interfaces/.nav.yml b/docs/dev/notkinopoiskphp/interfaces/.nav.yml index a1d149f..ae2b83f 100644 --- a/docs/dev/notkinopoiskphp/interfaces/.nav.yml +++ b/docs/dev/notkinopoiskphp/interfaces/.nav.yml @@ -1,6 +1,6 @@ title: Интерфейсы (Interfaces) nav: - - Оглавление: index.md + - index.md - "*" sort: - type: alphabetical \ No newline at end of file + type: alphabetical diff --git a/docs/dev/notkinopoiskphp/models/.nav.yml b/docs/dev/notkinopoiskphp/models/.nav.yml index 82c9a10..ed50158 100644 --- a/docs/dev/notkinopoiskphp/models/.nav.yml +++ b/docs/dev/notkinopoiskphp/models/.nav.yml @@ -1,6 +1,6 @@ title: Модели (Models) nav: - - Оглавление: index.md + - index.md - "*" sort: - type: alphabetical \ No newline at end of file + type: alphabetical diff --git a/docs/dev/notkinopoiskphp/responses/.nav.yml b/docs/dev/notkinopoiskphp/responses/.nav.yml index 845201a..c1b6aa3 100644 --- a/docs/dev/notkinopoiskphp/responses/.nav.yml +++ b/docs/dev/notkinopoiskphp/responses/.nav.yml @@ -1,6 +1,6 @@ title: Ответы API (Responses) nav: - - Оглавление: index.md + - index.md - "*" sort: type: alphabetical diff --git a/docs/dev/notkinopoiskphp/services/.nav.yml b/docs/dev/notkinopoiskphp/services/.nav.yml index f7437de..355b7fe 100644 --- a/docs/dev/notkinopoiskphp/services/.nav.yml +++ b/docs/dev/notkinopoiskphp/services/.nav.yml @@ -1,6 +1,6 @@ title: Сервисы (Services) nav: - - Оглавление: index.md + - index.md - "*" sort: type: alphabetical diff --git a/docs/tags.md b/docs/tags.md index 6c23dcc..abeab35 100644 --- a/docs/tags.md +++ b/docs/tags.md @@ -1,6 +1,4 @@ --- -tags: - - Общее title: "Ключевые слова - DevCraft Документации" description: "Документация по ключевые слова." keywords: "Общее, ключевые слова, DevCraft, документация" @@ -9,11 +7,11 @@ og:title: "Ключевые слова" og:description: "Документация по ключевые слова." og:image: "https://devcraft.club/data/assets/logo_default/devcraftx2.png" twitter:title: "Ключевые слова" -twitter:description: "Документация по ключевые слова." +twitter:description: "Документация по ключевым словам." --- # Ключевые слова Перечень ключевых слов в документации: -[TAGS] \ No newline at end of file + diff --git a/mkdocs.yml b/mkdocs.yml index 19c42bc..b390b31 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -21,8 +21,8 @@ theme: - content.code.select - navigation.instant - navigation.tracking - # - navigation.tabs - # - navigation.tabs.sticky + # - navigation.tabs + # - navigation.tabs.sticky - navigation.sections - toc.follow - navigation.top @@ -51,7 +51,10 @@ plugins: - exclude - exclude-search - git-revision-date - - tags + - tags: + listings_map: + scoped: + scope: true - autorefs: resolve_closest: true - minify: