masyasmv/otus_ioc_container

There is no license information available for the latest version (v1.0.0) of this package.

Домашка IoC

v1.0.0 2025-07-23 23:22 UTC

This package is auto-updated.

Last update: 2025-07-30 20:15:43 UTC


README

Проект: Лёгкий Inversion of Control (IoC) контейнер с поддержкой скопов и потокобезопасности.

Оглавление

  1. Описание

  2. Особенности

  3. Требования

  4. Установка

  5. Быстрый старт

  6. Примеры использования

  7. Структура проекта

  8. Тестирование

  9. CI/CD

  10. Лицензия

Описание

Данный репозиторий содержит реализацию собственного IoC контейнера, разработанного в рамках домашнего задания курса "Расширяемая фабрика и IoC" на Otus. Контейнер предоставляет единый фасадный метод IoC::Resolve(string $key, mixed ...$args), позволяющий:

  • Регистрировать зависимости (фабрики команд) в глобальном или локальном скопе.
  • Разрешать зависимости по ключу, создавая соответствующие объекты.
  • Управлять скопами для изоляции контекста (например, отдельные игры или потоки).
  • Потокобезопасно хранить собственное состояние через ключ Scopes.

Особенности

  • Один фасадный метод — все операции идут через IoC::Resolve.
  • Скопы — возможность создавать и переключаться между разными наборами зависимостей.
  • Потокобезопасность — контейнер может работать в параллельных средах без конфликтов.
  • Макро-команда — поддержка компоновки нескольких команд в едином объекте.
  • Лёгкая интеграция — PSR-4 автозагрузка, минимум зависимостей.

Требования

  • PHP 8.3 или выше
  • Composer
  • Xdebug (для сбора покрытия тестов)

Установка

# Клонируем репозиторий
git clone https://github.com/MasyaSmv/otus_ioc_container.git
cd otus_ioc_container

# Устанавливаем зависимости
composer install

# (Опционально) оптимизируем автозагрузку
composer dump-autoload -o

Быстрый старт

<?php
use Masyasmv\IoC\IoC;
use Masyasmv\Game\Entity\Ship;
use Masyasmv\Game\Service\MoveCommand;

// 1. Регистрируем фабрику команды "move.forward"
IoC::Resolve(
    'IoC.Register',
    'move.forward',
    static fn(Ship $ship) => new MoveCommand($ship, 0, 1)
)->Execute();

// 2. Разрешаем команду по ключу и выполняем
\$ship = new Ship();
\$cmd  = IoC::Resolve('move.forward', \$ship);
\$cmd->execute();  // теперь \$ship.getY() увеличится на 1

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

Регистрация команд

IoC::Resolve(
    'IoC.Register',
    'rotate.right',
    static fn(Ship \$ship) => new RotateCommand(\$ship, 90.0)
)->Execute();

Разрешение зависимости

\$ship = new Ship();
\$cmd  = IoC::Resolve('rotate.right', \$ship);
\$cmd->execute();

Работа со скопами

// Создаём новый скоп "game1"
IoC::Resolve('Scopes.New', 'game1')->Execute();

// Переключаемся в скоп game1
IoC::Resolve('Scopes.Current', 'game1')->Execute();

// Всё, что регистрируется дальше, живёт в game1
IoC::Resolve('IoC.Register', 'foo', fn() => 'bar')->Execute();

// Можно вернуться в global
IoC::Resolve('Scopes.Current', 'global')->Execute();

Структура проекта

├── src/               # Исходный код контейнера и набора примеров
│   ├── IoC.php        # Фасад и логика контейнера
│   ├── Contract/      # Примеры сущностей и команд (Ship, MoveCommand...)
│   ├── Entity/
│   ├── Service/
│   └── Macro/
├── tests/             # Unit- и Thread-тесты
│   ├── Unit/
│   └── Thread/
├── coverage/          # HTML-отчёт покрытия (генерируется)
├── composer.json      # Настройки Composer
├── phpunit.xml        # Конфигурация PHPUnit + coverage
└── README.md          # Текущий файл

Тестирование

  • Быстрый прогон без покрытия:

    composer test
  • Полный отчёт покрытия:

    composer test-coverage

Отчёт в формате HTML появится в папке coverage/.

CI/CD

В проекте настроен GitHub Actions workflow tests.yml, который выполняет:

  1. Установку зависимостей на PHP 8.3.
  2. Запуск Unit- и Thread-тестов.
  3. Генерацию отчёта покрытия.

Лицензия

MIT © MasyaSmv