Перейти к содержанию

title: Интерфейсы description: Система контрактов KinopoiskDev для обеспечения совместимости и расширяемости библиотеки keywords: интерфейсы, interfaces, psr, cache, logger, стандарты category: contracts tags: - Kinopoisk - interfaces - контракты - интерфейсы - contracts


Интерфейсы

Система контрактов KinopoiskDev предоставляет интерфейсы для обеспечения совместимости и расширяемости библиотеки. Все интерфейсы основаны на PSR стандартах для максимальной совместимости с экосистемой PHP.

Обзор

Интерфейсы в KinopoiskDev используются для:

  • Стандартизации - обеспечение единообразного интерфейса
  • Расширяемости - возможность подключения сторонних реализаций
  • Тестирования - легкая замена реальных сервисов на моки
  • PSR совместимости - следование стандартам PHP-FIG

Доступные интерфейсы

CacheInterface

Файл: CacheInterface.md

Интерфейс для сервиса кэширования, определяющий контракт для работы с различными системами кэширования:

PHP
1
2
3
4
5
6
7
8
9
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

PSR-3 совместимый интерфейс для логирования, основанный на стандартах PHP-FIG:

PHP
1
2
3
4
5
6
7
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
<?php

use KinopoiskDev\Contracts\CacheInterface;
use KinopoiskDev\Kinopoisk;

class RedisCache implements CacheInterface {
    private Redis $redis;

    public function __construct(Redis $redis) {
        $this->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
<?php

use KinopoiskDev\Contracts\LoggerInterface;
use KinopoiskDev\Kinopoisk;

class CustomLogger implements LoggerInterface {
    public function debug(string $message, array $context = []): void {
        echo "[DEBUG] {$message}\n";
    }

    public function info(string $message, array $context = []): void {
        echo "[INFO] {$message}\n";
    }

    public function warning(string $message, array $context = []): void {
        echo "[WARNING] {$message}\n";
    }

    public function error(string $message, array $context = []): void {
        echo "[ERROR] {$message}\n";
    }

    public function critical(string $message, array $context = []): void {
        echo "[CRITICAL] {$message}\n";
    }
}

// Использование с KinopoiskDev
$logger = new CustomLogger();
$kinopoisk = new Kinopoisk(apiToken: 'token', logger: $logger);

Комбинированное использование

PHP
<?php

use KinopoiskDev\Contracts\CacheInterface;
use KinopoiskDev\Contracts\LoggerInterface;
use KinopoiskDev\Kinopoisk;

class ProductionConfig {
    private CacheInterface $cache;
    private LoggerInterface $logger;

    public function __construct() {
        // Настройка Redis кэша
        $redis = new Redis();
        $redis->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
1
2
3
4
5
6
7
use KinopoiskDev\Services\CacheService;

$cache = new CacheService();
$kinopoisk = new Kinopoisk(apiToken: 'token', cache: $cache);

// Кэширование автоматически работает для всех запросов
$movie = $kinopoisk->getMovieById(301); // Результат кэшируется

Автоматическое логирование

Логгер автоматически записывает все операции:

PHP
1
2
3
4
5
6
$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 - встроенная реализация кэша
  • ValidationService - сервис валидации
  • Kinopoisk - главный класс с поддержкой контрактов

Преимущества

Стандартизация

PHP
1
2
3
4
5
// Единый интерфейс для всех кэш-драйверов
interface CacheInterface {
    public function get(string $key): mixed;
    public function set(string $key, mixed $value, int $ttl): bool;
}

Расширяемость

PHP
1
2
3
4
5
6
// Легкая замена реализации
$kinopoisk = new Kinopoisk(
    apiToken: 'token',
    cache: new RedisCache($redis),    // Redis
    logger: new MonologLogger()       // Monolog
);

Тестируемость

PHP
1
2
3
4
5
6
7
8
9
// Легкое создание моков для тестов
$mockCache = $this->createMock(CacheInterface::class);
$mockLogger = $this->createMock(LoggerInterface::class);

$kinopoisk = new Kinopoisk(
    apiToken: 'token',
    cache: $mockCache,
    logger: $mockLogger
);

Полезные ссылки


Интерфейсы KinopoiskDev - обеспечивают стандартизацию и расширяемость библиотеки через PSR совместимые интерфейсы.