Передача статических классов через 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
не является юридическим термином).
Доступные варианты:
Мини объект
Carbon:now()
вашему конструктору:$container['App\Controllers\GroupController'] = function($ci) { return new App\Controllers\GroupController( $ci->Logger, $ci->GroupService, $ci->JWT, \Carbon:now() // here ); };
Передайте вызываемый объект:
$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');
Используя второй вариант, вы можете определить имя функции динамически.