PHPackages                             kaspi/di-container - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [PSR &amp; Standards](/categories/psr-standards)
4. /
5. kaspi/di-container

ActiveLibrary[PSR &amp; Standards](/categories/psr-standards)

kaspi/di-container
==================

Dependency injection container with autowired

v4.1.1(1mo ago)2355↓100%1[14 issues](https://github.com/agdobrynin/di-container/issues)[1 PRs](https://github.com/agdobrynin/di-container/pulls)MITPHPPHP 8.1 - 8.5

Since Jan 6Pushed 1mo ago2 watchersCompare

[ Source](https://github.com/agdobrynin/di-container)[ Packagist](https://packagist.org/packages/kaspi/di-container)[ RSS](/packages/kaspi-di-container/feed)WikiDiscussions main Synced 1mo ago

READMEChangelog (10)Dependencies (7)Versions (97)Used By (0)

DiContainer
===========

[](#dicontainer)

Kaspi/di-container — это контейнер внедрения зависимостей для PHP &gt;= 8.1 реализующий [рекомендацию PSR-11](https://www.php-fig.org/psr/psr-11/).

Установка
---------

[](#установка)

```
composer require kaspi/di-container
```

### Особенности

[](#особенности)

- **Autowire** – контейнер автоматически создаёт и внедряет зависимости.
- **Zero configuration** – если класс не имеет зависимостей или зависит только от других конкретных классов, контейнеру не нужно указывать, как разрешить этот класс.
- **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  was published.');
        return $this->mail->send();
    }
}
```

👷‍♂️ Создание контейнера и разрешение зависимостей:

```
use App\Controllers\PostController;
use App\Models\Post;
use Kaspi\DiContainer\DiContainerBuilder;

// Создать контейнер.
$container = (new DiContainerBuilder())
    ->build();

// more code...

// получить класс PostController с внедренным сервисом Mail.
$postController = $container->get(PostController::class);
//Заполняем модель данными.
$post = new Post();
$post->title = 'Publication about DiContainer';
// Выполняем метод `PostController::post()`.
$postController->send($post);
```

Note

Контейнер "пытается" самостоятельно определить запрашиваемую зависимость - является ли это классом или callable типом.

`DiContainer` выполнит следующие действия для `App\Controllers\PostController`:

```
$post = new App\Controllers\PostController(
    new App\Services\Mail(
        new App\Services\Envelope()
    )
);
```

Tip

Реализация кода в [примере](https://github.com/agdobrynin/di-container/blob/main/examples/00-start.php)

Другой вариант для примера выше можно использовать для получения результата метод контейнера `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()`](https://github.com/agdobrynin/di-container/blob/main/docs/03-call-method.md)

Note

Примеры использования пакета kaspi/di-container в [репозитории](https://github.com/agdobrynin/di-container-examples)

### Конфигурирование DiContainer

[](#конфигурирование-dicontainer)

Для конфигурирования контейнера используется класс `\Kaspi\DiContainer\DiContainerConfig`который реализует интерфейс `\Kaspi\DiContainer\Interfaces\DiContainerConfigInterface`.

#### Нулевая конфигурация для внедрения зависимостей:

[](#нулевая-конфигурация-для-внедрения-зависимостей)

```
\Kaspi\DiContainer\Interfaces\DiContainerConfigInterface::isUseZeroConfigurationDefinition(): bool;
```

**Не нужно указывать контейнеру, как разрешить конкретный PHP-класс**если класс не имеет зависимостей, или зависит только от других конкретных классов, или зависит от ранее сконфигурированных классов (интерфейсов).

#### Использовать Php-атрибуты для конфигурирования:

[](#использовать-php-атрибуты-для-конфигурирования)

```
\Kaspi\DiContainer\Interfaces\DiContainerConfigInterface::isUseAttribute(): bool;
```

Предоставляет возможность [конфигурирования определений на базе PHP атрибутов](https://github.com/agdobrynin/di-container/blob/main/docs/02-attribute-definition.md).

#### Разрешать зависимость как синглтон:

[](#разрешать-зависимость-как-синглтон)

```
\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::class`
- `Kaspi\DiContainer\Interfaces\DiContainerInterface::class`
- `Kaspi\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**](https://github.com/agdobrynin/di-container/blob/main/docs/06-container-builder.md).
- 🐘 [DiContainer с конфигурированием **в стиле php определений**](https://github.com/agdobrynin/di-container/blob/main/docs/01-php-definition.md).
- \#️⃣ [DiContainer c конфигурированием **через PHP атрибуты**](https://github.com/agdobrynin/di-container/blob/main/docs/02-attribute-definition.md).
- 📦 [Метод контейнера `call()`](https://github.com/agdobrynin/di-container/blob/main/docs/03-call-method.md) для вызова чистых `callable` типов и дополнительных определений.
- 🔖 [Тэгирование определений и сервисов](https://github.com/agdobrynin/di-container/blob/main/docs/05-tags.md).

Тесты
-----

[](#тесты)

Прогнать тесты без подсчёта покрытия кода

```
composer test
```

Запуск тестов с проверкой покрытия кода тестами

```
./vendor/bin/phpunit
```

Статический анализ кода
-----------------------

[](#статический-анализ-кода)

Для статического анализа используем пакет [PHPStan](https://github.com/phpstan/phpstan).

```
composer stat
```

```
./vendor/bin/phpstan
```

Code style
----------

[](#code-style)

Для приведения кода к стандартам используем php-cs-fixer который объявлен в dev зависимости composer-а

```
composer fixer
```

Использование Docker образа с PHP 8.1, 8.2, 8.3, 8.4, 8.5
---------------------------------------------------------

[](#использование-docker-образа-с-php-81-82-83-84-85)

Указать образ с версией PHP можно в файле `.env` в ключе `PHP_IMAGE`. По умолчанию контейнер собирается с образом `php:8.1-cli-alpine`.

### Собрать контейнер

[](#собрать-контейнер)

```
docker-compose build
```

### Установить зависимости php composer-а:

[](#установить-зависимости-php-composer-а)

```
docker-compose run --rm php composer install
```

🔔 Если установлен `make` в системе:

```
make install
```

### Тесты

[](#тесты-1)

Запуск тестов без отчёта о покрытии кода:

```
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

[](#статический-анализ-кода-phpstan)

```
docker-compose run --rm php vendor/bin/phpstan
```

если установлен `make` в системе:

```
make stat
```

### Запуск комплексной проверки

[](#запуск-комплексной-проверки)

Если установлен `make` – запуск проверки code-style, stat analyzer, tests:

```
make all
```

Запуск тестов для всех поддерживаемых версий PHP через Docker образы.
---------------------------------------------------------------------

[](#запуск-тестов-для-всех-поддерживаемых-версий-php-через-docker-образы)

Если установлен `make` – перед запуском тестов удаляется директория `vendor` и файл `composer.lock`, устанавливаются зависимости только потом выполняются тесты:

```
make test-supports-php
```

### Другое

[](#другое)

Можно работать в shell оболочке в docker контейнере:

```
docker-compose run --rm php sh
```

###  Health Score

48

—

FairBetter than 94% of packages

Maintenance76

Regular maintenance activity

Popularity18

Limited adoption so far

Community9

Small or concentrated contributor base

Maturity75

Established project with proven stability

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~8 days

Total

95

Last Release

55d ago

Major Versions

v1.7.0 → v2.0.02024-10-13

v2.8.0 → v3.0.02024-11-29

v3.15.0 → v4.0.02026-01-22

v3.15.1 → v4.0.42026-02-02

v3.15.2 → v4.0.52026-02-05

PHP version history (5 changes)v1.0.1PHP &gt;=8.0

v1.0.4PHP ^8.0 || ^8.1 || ^8.2 || ^8.3

v3.9.0PHP ^8.0 || ^8.1 || ^8.2 || ^8.3 || ^8.4

v4.0.0PHP ^8.1 || ^8.2 || ^8.3 || ^8.4

v4.1.0PHP 8.1 - 8.5

### Community

Maintainers

![](https://www.gravatar.com/avatar/ae700adf1c969c1b76a10204e7b88afc4a3121e2979bce988b4e9fa5a756a827?d=identicon)[ag.dobrynin](/maintainers/ag.dobrynin)

---

Top Contributors

[![agdobrynin](https://avatars.githubusercontent.com/u/14299950?v=4)](https://github.com/agdobrynin "agdobrynin (639 commits)")

---

Tags

autowiringcontainerdependency-injectiondependency-injection-containerphpphp-librarypsr-11containerPSR-11Autowiringdependency-injectiondiautowire

###  Code Quality

TestsPHPUnit

Static AnalysisPHPStan, Rector

Code StylePHP CS Fixer

Type Coverage Yes

### Embed Badge

![Health badge](/badges/kaspi-di-container/health.svg)

```
[![Health](https://phpackages.com/badges/kaspi-di-container/health.svg)](https://phpackages.com/packages/kaspi-di-container)
```

###  Alternatives

[php-di/php-di

The dependency injection container for humans

2.8k48.9M989](/packages/php-di-php-di)[slince/di

A flexible dependency injection container

20260.4k6](/packages/slince-di)[devanych/di-container

Simple implementation of a PSR-11 dependency injection container

124.2k3](/packages/devanych-di-container)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
