Передача статических классов через Dependancy Injection

Как можно передать статический класс в объект через Dependency Injection?

Например, Carbon использует статические методы:

$tomorrow = Carbon::now()->addDay();

У меня есть службы, которые зависят от Carbon, и в настоящее время я использую библиотеку в зависимостях, не вводя их. Но это увеличивает связь, и я хотел бы вместо этого передать его через DI.

У меня есть следующий контроллер:

$container['App\Controllers\GroupController'] = function($ci) {
    return new App\Controllers\GroupController(
        $ci->Logger,
        $ci->GroupService,
        $ci->JWT
    );
};

Как мне передать Carbon в это?

1 ответ

Решение

Статические методы называются static потому что они могут быть вызваны без создания экземпляра объекта класса. Итак, вы не можете пройти static class (четное static class не является юридическим термином).

Доступные варианты:

  1. Мини объект Carbon:now() вашему конструктору:

    $container['App\Controllers\GroupController'] = function($ci) {
        return new App\Controllers\GroupController(
            $ci->Logger,
            $ci->GroupService,
            $ci->JWT,
            \Carbon:now()          // here
        );
    };
    
  2. Передайте вызываемый объект:

    $container['App\Controllers\GroupController'] = function($ci) {
        return new App\Controllers\GroupController(
            $ci->Logger,
            $ci->GroupService,
            $ci->JWT,
            ['\Carbon', 'now']   // here or '\Carbon::now'
        );
    };
    

    А позже создать Carbon Например, используя что-то вроде:

    $carb_obj = call_user_func(['\Carbon', 'now']);
    $carb_obj = call_user_func('\Carbon::now');
    

Используя второй вариант, вы можете определить имя функции динамически.

Другие вопросы по тегам