通过依赖注入传递静态 类

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 不是合法术语)。

可用的选项是:

  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');
    

使用第二个选项,您可以动态定义函数名称。