通过依赖注入传递静态 类
Passing static classes via Dependancy Injection
如何通过依赖注入将静态 class 传递给对象?
例如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 传递给它?
静态方法被称为 static
因为它们可以被调用 而无需 实例化 class 对象。所以,你不能传递 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');
使用第二个选项,您可以动态定义函数名称。
如何通过依赖注入将静态 class 传递给对象?
例如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 传递给它?
静态方法被称为 static
因为它们可以被调用 而无需 实例化 class 对象。所以,你不能传递 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');
使用第二个选项,您可以动态定义函数名称。