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
Requires
- php: ^8.3
Requires (Dev)
- phpunit/phpunit: ^12.1
This package is auto-updated.
Last update: 2025-07-30 20:15:43 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