bcchicr/di-container

A minimal PSR-11 compatible Dependency Injection Container with auto-wiring

1.1.0 2024-03-08 15:56 UTC

This package is auto-updated.

Last update: 2024-10-06 00:50:47 UTC


README

Простой контейнер зависимостей, соответствующий стандарту PSR-11. Реализует автосвязывание и кэширование.

Требования

  • PHP 8.2 или более поздняя версия

Установка

Установка через Composer:

composer require bcchicr/di-container

Использование

Создание контейнера:

use Bcchicr\Container\Container;

$container = new Container();

Регистрация зависимостей:

/**
 * Зарегистрировать вызываемое значение в качестве определения зависимости
 *
 * @param string $id
 * @param callable $callback
 * @return void
 */
$container->register($id, function(ContainerInterface $container) {
    return 'dependency';
});

/**
 * Зарегистрировать зависимость непосредственно
 *
 * @param string $id
 * @param mixed $instance
 * @return void
 */
$container->instance($id, 'instance');

Проверка на возможность получения зависимости из контейнера:

/**
 * Возвращает 'true` если зависимость с указанным ID может быть получена из контейнера
 *
 * @param string $id
 * @return bool
 */
$container->has($id);

Получение зависимости из контейнера:

/**
 * Возвращает зависимость с указанным ID
 *
 * @param string $id
 * @return mixed
 * @throws Bcchicr\Container\Exception\NotFoundException Если ID неизвестен контейнеру
 * @throws Bcchicr\Container\Exception\ContainerGetException Если не получается получить зависимость из определения
 */
$container->get($id);

Два последовательных вызова get() с одинаковым ID возвращают тот же объект:

$dep1 = $container->get($id);
$dep2 = $container->get($id);

$dep1 === $dep2 // true

Реализовано автосвязывание объекта по имени класса:

$dep1 = $container->get(SomeClass::class);

Оно возможно, если:

  • Конструктор получаемого объекта не содержит параметров
  • Параметры конструктора получаемого объекта имеют значения по умолчанию
  • Параметры конструктора являются объектами, доступными для получения из контейнера (В т.ч. через автосвязывание)