kaspi / di-container
Dependency injection container with autowired
Installs: 343
Dependents: 0
Suggesters: 0
Security: 0
Stars: 2
Watchers: 2
Forks: 1
Open Issues: 13
pkg:composer/kaspi/di-container
Requires
- php: ^8.1 || ^8.2 || ^8.3 || ^8.4
- ext-tokenizer: *
- psr/container: ^2.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.41
- mikey179/vfsstream: ^1.6
- phpstan/phpstan: ^2.1
- phpstan/phpstan-strict-rules: ^2.0
- phpunit/phpunit: ^10
- rector/rector: ^2.3
Provides
- dev-main
- v4.1.x-dev
- v4.0.x-dev
- v4.0.3
- v4.0.2
- v4.0.1
- v4.0.0
- v3.15.x-dev
- v3.15.0
- v3.14.x-dev
- v3.14.3
- v3.14.2
- v3.14.1
- v3.14.0
- v3.13.x-dev
- v3.13.3
- v3.13.2
- v3.13.1
- v3.13.0
- v3.12.1
- v3.12.0
- 3.11.0
- v3.10.2
- v3.10.1
- v3.10.0
- v3.9.3
- v3.9.2
- v3.9.1
- v3.9.0
- v3.8.0
- v3.7.1
- v3.7.0
- v3.6.3
- v3.6.2
- v3.6.1
- v3.6.0
- v3.5.1
- v3.5.0
- v3.4.1
- v3.4.0
- v3.3.0
- v3.2.0
- v3.1.0
- v3.0.1
- v3.0.0
- v2.8.0
- v2.7.9
- v2.7.8
- v2.7.7
- v2.7.6
- v2.7.5
- v2.7.4
- v2.7.3
- v2.7.2
- v2.7.1
- v2.7.0
- v2.6.2
- v2.6.1
- v2.6.0
- v2.5.0
- v2.4.0
- v2.3.1
- v2.3.0
- v2.2.3
- 2.2.2
- v2.2.1
- v2.2.0
- v2.1.1
- v2.1.0
- v2.0.4
- v2.0.3
- v2.0.2
- v2.0.1
- v2.0.0
- v1.7.0
- v1.6.3
- v1.6.2
- v1.6.1
- v1.6.0
- v1.5.0
- v1.4.0
- v1.3.0
- v1.2.1
- v1.2.0
- v1.1.1
- v1.1.0
- v1.0.5
- v1.0.4
- v1.0.3
- v1.0.2
- v1.0.1
- dev-4.1.x/factory
This package is auto-updated.
Last update: 2026-01-28 17:43:05 UTC
README
Kaspi/di-container — это легковесный контейнер внедрения зависимостей для PHP >= 8.1
Установка
composer require kaspi/di-container
Особенности
- Autowire – контейнер автоматически создаёт и внедряет зависимости.
- Поддержка "zero configuration for dependency injection" – когда ненужно объявлять зависимость в определениях контейнера. Если класс не имеет зависимостей или зависит только от других конкретных классов, контейнеру не нужно указывать, как разрешить этот класс.
- Поддержка Php-атрибутов для конфигурирования сервисов в контейнере.
- Поддержка тегов (tags) для определений и сервисов в контейнере.
- Компиляция контейнера – генерация настроенного контейнера в PHP-код оптимизированный специально для вашей конфигурации и ваших классов.
Быстрый старт
Определения классов:
// src/Services/Envelope.php namespace App\Services; // Класс для создания сообщения class Envelope { public function subject(string $subject): static { // ... return $this; } public function message(string $message): static { // ... return $this; } }
// src/Services/Mail.php namespace App\Services; // Сервис отправки почты class Mail { public function __construct(private Envelope $envelope) {} public function envelop(): Envelope { return $this->envelope; } public function send(): bool { // отправка сообщения } }
// src/Models/Post.php namespace App\Models; // Модель данных — пост в блоге. class Post { public string $title; // ... }
// src/Controllers/PostController.php namespace App\Controllers; use App\Services\Mail; use App\Models\Post; // Контроллер для обработки действия. class PostController { public function __construct(private Mail $mail) {} public function send(Post $post): bool { $this->mail->envelop() ->subject('Publication success') ->message('Post <'.$post->title.'> was published.'); return $this->mail->send(); } }
use App\Controllers\PostController; use App\Models\Post; use Kaspi\DiContainer\DiContainerBuilder; // Создать контейнер. $container = (new DiContainerBuilder()) ->build(); // more code... //Заполняем модель данными. $post = new Post(); $post->title = 'Publication about DiContainer'; // получить класс PostController с внедренным сервисом Mail и выполнить метод "send" $postController = $container->get(PostController::class); $postController->send($post);
Note
Контейнер "пытается" самостоятельно определить запрашиваемую зависимость - является ли это классом или callable типом.
DiContainer выполнит следующие действия для App\Controllers\PostController:
$post = new App\Controllers\PostController( new App\Services\Mail( new App\Services\Envelope() ) );
Tip
Реализация кода в примере
Другой вариант для примера выше можно использовать для получения результата метод контейнера call():
use App\Controllers\PostController; use App\Models\Post; $post = new Post(); $post->title = 'Publication about DiContainer'; // ... // получить класс PostController с внедренным сервисом Mail и выполнить метод "send" // с передачей именованного аргумента $container->call( definition: [PostController::class, 'send'], post: $post );
Tip
Больше информации о методе call()
Note
Примеры использования пакета kaspi/di-container в репозитории
Конфигурирование DiContainer
Для конфигурирования контейнера используется класс
\Kaspi\DiContainer\DiContainerConfig
который реализует интерфейс
\Kaspi\DiContainer\Interfaces\DiContainerConfigInterface.
Нулевая конфигурация для внедрения зависимостей:
\Kaspi\DiContainer\Interfaces\DiContainerConfigInterface::isUseZeroConfigurationDefinition(): bool;
Не нужно указывать контейнеру, как разрешить конкретный PHP-класс если класс не имеет зависимостей, или зависит только от других конкретных классов, или зависит от ранее сконфигурированных классов (интерфейсов).
Использовать Php-атрибуты для конфигурирования:
\Kaspi\DiContainer\Interfaces\DiContainerConfigInterface::isUseAttribute(): bool;
Предоставляет возможность конфигурирования определений на базе PHP атрибутов.
Разрешать зависимость как синглтон:
\Kaspi\DiContainer\Interfaces\DiContainerConfigInterface::isSingletonServiceDefault(): bool;
Для определений в контейнере можно указать как разрешать сервис – возвращать всегда одни и тот же объект
или создавать объект сервиса каждый раз при получении через метод контейнера get().
Для определений контейнера у которых неуказан способ получения через метод контейнера get()
применяется значение по умолчанию из конфигурации.
Пример конфигурации:
use Kaspi\DiContainer\{DiContainerConfig, DiContainerBuilder}; $diConfig = new DiContainerConfig( useZeroConfigurationDefinition: false, useAttribute: false, isSingletonServiceDefault: true, ); // передать настройки в построитель контейнера $container = (new DiContainerBuilder(containerConfig: $diConfig)) ->build();
Особенности получения некоторых классов и интерфейсов.
Некоторые интерфейсы или классы всегда возвращают текущий контейнер зависимостей. При разрешении зависимости для интерфейсов и классов:
Psr\Container\ContainerInterface::classKaspi\DiContainer\Interfaces\DiContainerInterface::classKaspi\DiContainer\DiContainer::class
будет получен текущий контейнер зависимостей.
use Kaspi\DiContainer\DiContainerBuilder; use Psr\Container\ContainerInterface; function testFunc(ContainerInterface $c) { return $c; } $container = (new DiContainerBuilder())->build(); var_dump($container->call('testFunc') instanceof DiContainer); // true var_dump($container->call('testFunc') instanceof ContainerInterface); // true
use Kaspi\DiContainer\DiContainerBuilder; use Psr\Container\ContainerInterface; class TestClass { public function __construct( public ContainerInterface $container ) {} } $container = (new DiContainerBuilder())->build(); var_dump($container->get(TestClass::class)->container instanceof ContainerInterface); // true
🧰 Подробное описание конфигурирования и использования
- 👷♂️ Инструмент для сборки контейнера зависимостей DiContainerBuilder.
- 🐘 DiContainer с конфигурированием в стиле php определений.
- #️⃣ DiContainer c конфигурированием через PHP атрибуты.
- 📦 Метод контейнера
call()для вызова чистыхcallableтипов и дополнительных определений. - 🔖 Тэгирование определений и сервисов.
Тесты
Прогнать тесты без подсчёта покрытия кода
composer test
Запуск тестов с проверкой покрытия кода тестами
./vendor/bin/phpunit
Статический анализ кода
Для статического анализа используем пакет PHPStan.
composer stat
./vendor/bin/phpstan
Code style
Для приведения кода к стандартам используем php-cs-fixer который объявлен в dev зависимости composer-а
composer fixer
Использование Docker образа с PHP 8.1, 8.2, 8.3, 8.4
Указать образ с версией PHP можно в файле .env в ключе PHP_IMAGE.
По умолчанию контейнер собирается с образом php:8.1-cli-alpine.
Собрать контейнер
docker-compose build
Установить зависимости php composer-а:
docker-compose run --rm php composer install
🔔 Если установлен make в системе:
make install
Тесты
Запуск тестов без отчёта о покрытии кода:
docker-compose run --rm php vendor/bin/phpunit --no-coverage
🔔 Если установлен make в системе:
make test
Прогнать тесты с отчётом о покрытии кода:
docker-compose run --rm php vendor/bin/phpunit
🔔 Если установлен make в системе:
make test-cover
⛑ pезультаты будут в папке
.coverage-html
Статический анализ кода PHPStan
docker-compose run --rm php vendor/bin/phpstan
если установлен make в системе:
make stat
Запуск комплексной проверки
Если установлен make – запуск проверки code-style, stat analyzer, tests:
make all
Другое
Можно работать в shell оболочке в docker контейнере:
docker-compose run --rm php sh