Как получить контейнер php-di в «не-контроллере»?

Для того чтобы получить контейнер php-di вне контроллера, вам понадобится прежде всего установить саму библиотеку php-di через composer. Выполните команду composer require php-di/php-di в вашей директории проекта.

После успешной установки вы сможете создать экземпляр контейнера php-di:

require 'vendor/autoload.php';

use DIContainerBuilder;

$containerBuilder = new ContainerBuilder();
$container = $containerBuilder->build();

Теперь у вас есть доступ к контейнеру php-di. Вы можете зарегистрировать свои зависимости с помощью метода set и получить их с помощью метода get. Ниже приведены примеры:

// Регистрация зависимости
$container->set('myService', function () {
    return new MyService();
});

// Получение зависимости
$myService = $container->get('myService');

Это дает вам возможность инъекции зависимости в ваши классы, включая "не-контроллеры". Например:

class MyService
{
    private $dependency;

    public function __construct(OtherService $dependency)
    {
        $this->dependency = $dependency;
    }
}

class OtherService
{
    // ...
}

// Регистрация зависимостей
$container->set('myService', function () use ($container) {
    $dependency = $container->get('otherService');
    return new MyService($dependency);
});

$container->set('otherService', function () {
    return new OtherService();
});

// Получение зависимости
$myService = $container->get('myService');

Теперь, когда вы получите myService из контейнера, контейнер сам разрешит зависимость otherService и создаст экземпляр MyService с правильными зависимостями.

Это небольшой пример использования контейнера php-di. Он позволяет вам гибко управлять зависимостями вашего приложения и достичь инверсии управления. Контейнер php-di также предоставляет множество других функций, таких как конфигурирование зависимостей, использование аннотаций для инъекции зависимостей и многое другое. Документация к библиотеке содержит полное объяснение всех возможностей.