Система моделей KinopoiskDev предоставляет типизированные классы для представления всех структур данных API kinopoisk.dev. Все модели основаны на объектно-ориентированном подходе с использованием PHP 8.3+ атрибутов для валидации и сериализации.
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;}
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;}
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;}
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;}
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;}
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;}
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;}
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;}
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;}
class ReviewInfo extends BaseModel { #[ApiField(name: 'id')] public int $id; #[ApiField(name: 'title')] public string $title; #[ApiField(name: 'type')] public ReviewType $type;}
class Season extends BaseModel { #[ApiField(name: 'number')] public int $number; #[ApiField(name: 'episodes')] public array $episodes; #[ApiField(name: 'episodesCount')] public int $episodesCount;}
class Episode extends BaseModel { #[ApiField(name: 'number')] public int $number; #[ApiField(name: 'name')] public string $name; #[ApiField(name: 'description')] public string $description;}
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;}
class MovieAward extends BaseModel { #[ApiField(name: 'nomination')] public Nomination $nomination; #[ApiField(name: 'winning')] public bool $winning;}
class PersonAward extends BaseModel { #[ApiField(name: 'nomination')] public Nomination $nomination; #[ApiField(name: 'winning')] public bool $winning;}
<?phpuseKinopoiskDev\Models\Movie;useKinopoiskDev\Models\Person;// Автоматическое создание из массива$movieData=['id'=>301,'name'=>'Матрица','year'=>1999,'rating'=>['kp'=>8.7,'imdb'=>8.7]];$movie=Movie::fromArray($movieData);// Доступ к свойствамecho$movie->name;// "Матрица"echo$movie->year;// 1999echo$movie->rating->kp;// 8.7
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(); // Проверка всех атрибутов
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'