masyasmv / otus_ioc_container
Домашка IoC
Installs: 3
Dependents: 0
Suggesters: 0
Security: 0
Stars: 0
Watchers: 0
Forks: 0
Open Issues: 0
pkg:composer/masyasmv/otus_ioc_container
Requires
- php: ^8.3
Requires (Dev)
- phpunit/phpunit: ^12.1
This package is auto-updated.
Last update: 2025-10-30 20:55:39 UTC
README
Проект: Лёгкий Inversion of Control (IoC) контейнер с поддержкой скопов и потокобезопасности.
Оглавление
Описание
Данный репозиторий содержит реализацию собственного 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, который выполняет:
- Установку зависимостей на PHP 8.3.
- Запуск Unit- и Thread-тестов.
- Генерацию отчёта покрытия.
Лицензия
MIT © MasyaSmv