Skip to content

Latest commit

 

History

History
81 lines (65 loc) · 4.98 KB

di_container.md

File metadata and controls

81 lines (65 loc) · 4.98 KB

Dependency injection container

Контейнер реализовывает интерфейс Psr\Container\ContainerInterface. Описание всех сервисов и их зависимостей описано в файлах:

Не допускается использования циклических зависимостей.

Регистрация сервиса

Чтобы зарегистрировать сервис, нужно в одном из файлов описания сервисов добавить его.

Рассмотрим пример регистрации сервиса ядра. Регистрировать его нужно в файле Okay/Core/config/services.php (версия для модулей).

Файл services.php возвращает массив с описанием сервисов, где ключ - это название сервиса, значение - описание сервиса.

Best practices: в качестве имени сервиса использовать полное имя класса

Пример:

use Okay\Core\OkayContainer\Reference\ParameterReference as PR;
use Okay\Core\OkayContainer\Reference\ServiceReference as SR;

[
    MyClass::class => [ // Имя сервиса
        'class' => MyClass::class, // Имя класса, из которого создавать экземпляр сервиса
        'arguments' => [ // Аргументы конструктора класса MyClass. Принимать в порядке, как здесь передаём
            new SR(OtherClass::class),
            new PR('db.driver'),
        ],
    ],
];

Описание классов ParameterReference и ServiceReference

Получение сервиса

Чтобы получить экземпляр сервиса нужно получить его через инъекцию в классе контроллера, или воспользоваться локатором служб. Также при регистрации сервиса, можно указать ему зависимость.

ParameterReference

Класс ParameterReference нужен когда сервис зависит от параметров (конфигов). Параметры для сервисов описываются в файле Okay/Core/config/parameters.php. Параметры это многомерный ассоциативный массив, который может содержать в конечных значениях как статические значения, так и значения из конфигурационного файла системы. Чтобы указать что нужно подставить значение из конфига, нужно в значении параметра указать это как переменную.

Пример:

$parameters = [
    'root_dir' => '{$root_dir}',
    'logger' => [
        'file' => __DIR__ . '/../../log/app.log',
    ],
    'db' => [
        'driver'   => '{$db_driver}',
        'dsn'      => '{$db_driver}:host={$db_server};dbname={$db_name};charset={$db_charset}',
        'user'     => '{$db_user}',
        'password' => '{$db_password}',
        'prefix'   => '{$db_prefix}',
        'db_sql_mode' => '{$db_sql_mode}',
        'db_timezone' => '{$db_timezone}',
        'db_names' => '{$db_names}',
    ],
];

Чтобы передать в сервис параметр, нужно в блоке arguments передать экземпляр класса ParameterReference (PR) который в конструктор принимает имя параметра-зависимости. В имени стоит через точку разделять вложенность массива параметров. Пример передачи в качестве зависимости значения $parameters['db']['driver'].

ServiceReference

Класс ServiceReference нужен когда сервис зависит от других сервисов. Чтобы передать сервис как зивисимость другому сервису, нужно в описании сервиса в блоке arguments передать экземпляр класса ServiceReference (SR) который в конструктор принимает имя сервиса-зависимости (пример выше).