通过Dependancy Injection传递静态类

时间:2016-12-16 12:40:12

标签: php dependency-injection slim pimple

如何通过依赖注入将静态类传递给对象?

例如Carbon使用静态方法:

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

我有依赖Carbon的服务,目前我在依赖中使用库而不注入它们。但是,这会增加耦合,我想通过DI传递它。

我有以下控制器:

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

如何将碳传递给它?

1 个答案:

答案 0 :(得分:3)

静态方法称为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');
    
  3. 使用第二个选项,您可以动态定义函数名称。