PHPackages                             fi1a/dependency-injection - 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. fi1a/dependency-injection

ActiveLibrary

fi1a/dependency-injection
=========================

Dependency injection container

1.0.2(3y ago)02.3k—0%1MITPHPPHP ^7.3 || ^8

Since Jan 3Pushed 3y ago1 watchersCompare

[ Source](https://github.com/fi1a/dependency-injection)[ Packagist](https://packagist.org/packages/fi1a/dependency-injection)[ Docs](https://github.com/fi1a/dependency-injection)[ RSS](/packages/fi1a-dependency-injection/feed)WikiDiscussions main Synced today

READMEChangelog (3)Dependencies (7)Versions (5)Used By (1)

Dependency injection container
==============================

[](#dependency-injection-container)

[![Latest Version](https://camo.githubusercontent.com/7c48c08f58ed6caef6902c08b5780641e2a7d6f4efaeb503b854031a2040fa3f/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f762f666931612f646570656e64656e63792d696e6a656374696f6e3f6c6162656c3d72656c65617365)](https://packagist.org/packages/fi1a/dependency-injection)[![Software License](https://camo.githubusercontent.com/3405dec22f06ab2a0334141d33baae6896eb935a4ae4fd4f8de4b527872a37c4/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f666931612f646570656e64656e63792d696e6a656374696f6e3f7374796c653d666c61742d737175617265)](https://github.com/fi1a/dependency-injection/blob/master/LICENSE)[![PHP Version](https://camo.githubusercontent.com/5c5663aa052314793cfcdd2a383a618398e23e2a448ec3b035ab3af91d18523b/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f7068702d762f666931612f646570656e64656e63792d696e6a656374696f6e3f7374796c653d666c61742d737175617265)](https://php.net)[![Coverage Status](https://camo.githubusercontent.com/0c967d746eb7f4fe28065a3b94d23faa207cd6f4a968535b20fce0310a87cf89/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f636f7665726167652d3130302532352d677265656e)](https://camo.githubusercontent.com/0c967d746eb7f4fe28065a3b94d23faa207cd6f4a968535b20fce0310a87cf89/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f636f7665726167652d3130302532352d677265656e)[![Total Downloads](https://camo.githubusercontent.com/d3bb5e88ee3f25309fdda3b226f0748acdee6c9f3f6d2d4044b1c25445969d22/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f64742f666931612f646570656e64656e63792d696e6a656374696f6e2e7376673f7374796c653d666c61742d73717561726526636f6c6f72423d6d656469756d76696f6c6574726564)](https://packagist.org/packages/fi1a/dependency-injection)[![Support mail](https://camo.githubusercontent.com/116fa0d447870a3a6c6c1f4b296c889707a6e30a69c2b28cbe8d0f6f5c3d4920/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6d61696c2d737570706f7274253430666931612e72752d627269676874677265656e)](mailto:support@fi1a.ru)

Контейнер [dependency injection](http://en.wikipedia.org/wiki/Dependency_injection), может разрешать зависимости, создавать экземпляры и настраивать классы. Поддерживает внедрение конструктора, свойств и методов.

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

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

Установить этот пакет можно как зависимость, используя Composer.

```
composer require fi1a/dependency-injection
```

Использование контейнера
------------------------

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

Для использования контейнера dependency injection, сначала необходимо в конфигурацию задать определения созданное с помощью builder'а. Название определения обычно является именем интерфейса. Когда запрашивается тип для создания объекта, будет использоваться это определение. Это происходит при вызове метода `get` непосредственно из контейнера. Объекты также создаются не явно при разрешении зависимостей.

```
use Fi1a\DI\Container;
use Fi1a\DI\ContainerConfig;
use Fi1a\DI\Builder;
use Fi1a\Unit\DI\Fixtures\ClassA;
use Fi1a\Unit\DI\Fixtures\ClassAInterface;
use Fi1a\Unit\DI\Fixtures\ClassC;
use Fi1a\Unit\DI\Fixtures\ClassCInterface;

$config = new ContainerConfig();

$config->addDefinition(
    Builder::build(ClassAInterface::class)
        ->defineClass(ClassA::class)
        ->getDefinition()
);

$config->addDefinition(
    Builder::build(ClassCInterface::class)
        ->defineClass(ClassC::class)
        ->defineConstructor([1, true])
        ->getDefinition()
);

$container = new Container($config);

$container->get(ClassCInterface::class); // ClassCInterface
```

Объект может быть определен несколькими способами:

- defineClass - сопоставление с конкретным классом;
- defineFactory - если реализация сложная и может быть лучше описана в коде, то следует использовать фабричный метод. При использовании фабричного метода, зависимости в аргументах автоматически разрешаются.
- defineObject - вернуть созданный экземпляр объекта.

Также доступны следующие определения:

- defineConstructor - задает аргументы для конструктора класса определенного как defineClass;
- defineProperty - задает значение свойства объекта;
- defineProperties - задает ассоциативный массив со значениями свойств объекта;
- defineMethod - задает метод объекта, который необходимо вызвать с объявленными аргументами;
- defineMethods - задает ассоциативный массив с методами объекта, которые необходимо вызвать с объявленными аргументами.

При отсутствии определения для запрашиваемого типа, контейнер выбросит исключение `Fi1a\DI\Exceptions\NotFoundException`.

defineClass
-----------

[](#defineclass)

Сопоставление с конкретным классом, определение аргументов конструктора, задание свойств и вызов методов:

```
use Fi1a\DI\Container;
use Fi1a\DI\ContainerConfig;
use Fi1a\DI\Builder;
use Fi1a\Unit\DI\Fixtures\ClassA;
use Fi1a\Unit\DI\Fixtures\ClassAInterface;

$config = new ContainerConfig();

$config->addDefinition(
    Builder::build(ClassAInterface::class)
        ->defineClass(ClassA::class)
        ->defineConstructor([
            'parameter1' => 10,
        ])
        ->defineProperty('property1', 100)
        ->defineMethod('setProperty2', [true])
        ->getDefinition()
);

$container = new Container($config);

/** @var ClassA $object */
$object = $container->get(ClassAInterface::class); // ClassAInterface

$object->property1; // 100
$object->property2; // true
```

defineFactory
-------------

[](#definefactory)

Используется замыкание как фабричный метод:

```
use Fi1a\DI\Container;
use Fi1a\DI\ContainerConfig;
use Fi1a\DI\Builder;
use Fi1a\Unit\DI\Fixtures\ClassA;
use Fi1a\Unit\DI\Fixtures\ClassAInterface;
use Fi1a\Unit\DI\Fixtures\ClassB;

$config = new ContainerConfig();

$config->addDefinition(
    Builder::build(ClassAInterface::class)
        ->defineFactory(function (ClassB $classB) {
            $instance = new ClassA($classB);
            $instance->property1 = 100;
            $instance->property2 = true;

            return $instance;
        })
        ->getDefinition()
);

$container = new Container($config);

/** @var ClassA $object */
$object = $container->get(ClassAInterface::class); // ClassAInterface

$object->property1; // 100
$object->property2; // true
```

Использование фабричного метода в классе:

```
use Fi1a\DI\Container;
use Fi1a\DI\ContainerConfig;
use Fi1a\DI\Builder;
use Fi1a\Unit\DI\Fixtures\ClassA;
use Fi1a\Unit\DI\Fixtures\ClassAInterface;
use Fi1a\Unit\DI\Fixtures\FactoryA;

$config = new ContainerConfig();

$config->addDefinition(
    Builder::build(ClassAInterface::class)
        ->defineFactory([FactoryA::class, 'factoryStatic'])
        ->getDefinition()
);

$container = new Container($config);

/** @var ClassA $object */
$object = $container->get(ClassAInterface::class); // ClassAInterface

$object->property1; // 100
$object->property2; // true
```

defineObject
------------

[](#defineobject)

Использовать уже созданный экземпляр объекта:

```
use Fi1a\DI\Container;
use Fi1a\DI\ContainerConfig;
use Fi1a\DI\Builder;
use Fi1a\Unit\DI\Fixtures\ClassB;
use Fi1a\Unit\DI\Fixtures\ClassBInterface;

$config = new ContainerConfig();

$config->addDefinition(
    Builder::build(ClassBInterface::class)
        ->defineObject(new ClassB())
        ->getDefinition()
);

$container = new Container($config);

/** @var ClassB $object */
$object = $container->get(ClassBInterface::class); // ClassBInterface
```

Хелпер di
---------

[](#хелпер-di)

Доступен хелпер `di()`, возвращающий один экземпляр контейнера для регистрации опредлений в других пакетах.

```
use Fi1a\DI\Builder;
use Fi1a\Unit\DI\Fixtures\ClassA;
use Fi1a\Unit\DI\Fixtures\ClassAInterface;
use Fi1a\Unit\DI\Fixtures\ClassC;
use Fi1a\Unit\DI\Fixtures\ClassCInterface;

di()->config()->addDefinition(
    Builder::build(ClassAInterface::class)
        ->defineClass(ClassA::class)
        ->getDefinition()
);

di()->config()->addDefinition(
    Builder::build(ClassCInterface::class)
        ->defineClass(ClassC::class)
        ->defineConstructor([1, true])
        ->getDefinition()
);

di()->get(ClassCInterface::class); // ClassCInterface
```

Создание определения из массива
-------------------------------

[](#создание-определения-из-массива)

Для создания определения из массива можно воспользоваться методом `buildFromArray` класса реализующего интерфейс `Fi1a\DI\ArrayBuilderInterface`:

```
use Fi1a\DI\ArrayBuilder;
use Fi1a\DI\Container;
use Fi1a\DI\ContainerConfig;
use Fi1a\Unit\DI\Fixtures\ClassA;
use Fi1a\Unit\DI\Fixtures\ClassAInterface;

$config = new ContainerConfig();

$config->addDefinition(
    $definition = ArrayBuilder::buildFromArray([
        'name' => ClassAInterface::class,
        'class_name' => ClassA::class,
        'constructor' => [100, true],
        'properties' => [
            'property1' => 100,
            'property2' => true,
        ],
        'methods' => [
            'setProperty1' => [100],
            'setProperty2' => [true],
        ],
    ])->getDefinition()
);

$container = new Container($config);

/** @var ClassA $object */
$object = $container->get(ClassAInterface::class); // ClassAInterface
```

Преобразование определения и коллекций в массив
-----------------------------------------------

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

Для преобразования определений и коллекций в массив, можно воспользоваться методом `definition`, или `collection` класса реализующего интерфейс `Fi1a\DI\ToArrayInterface`:

```
use Fi1a\DI\ContainerConfig;
use Fi1a\DI\Builder;
use Fi1a\DI\ToArray;
use Fi1a\Unit\DI\Fixtures\ClassA;
use Fi1a\Unit\DI\Fixtures\ClassAInterface;

$config = new ContainerConfig();

$definition = Builder::build(ClassAInterface::class)
    ->defineClass(ClassA::class)
    ->defineConstructor([
        'parameter1' => 10,
    ])
    ->defineProperty('property1', 100)
    ->defineMethod('setProperty2', [true])
    ->getDefinition();

$config->addDefinition($definition);

$toArray = new ToArray();

$array = $toArray->collection($config->getDefinitions()); // [[...], [...]]
$arrayDefinition = $toArray->definition($definition); // [...]
```

###  Health Score

25

—

LowBetter than 40% of packages

Maintenance20

Infrequent updates — may be unmaintained

Popularity20

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity43

Maturing project, gaining track record

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 ~16 days

Total

4

Last Release

1125d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/d4f26c1adaa632741fadf55b1328cbd22ac91282aecfae2027d105df0ddedee4?d=identicon)[fi1a](/maintainers/fi1a)

---

Tags

containerdependency-injectionphp

###  Code Quality

TestsPHPUnit

Static AnalysisPsalm

Code StylePHP\_CodeSniffer

Type Coverage Yes

### Embed Badge

![Health badge](/badges/fi1a-dependency-injection/health.svg)

```
[![Health](https://phpackages.com/badges/fi1a-dependency-injection/health.svg)](https://phpackages.com/packages/fi1a-dependency-injection)
```

PHPackages © 2026

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