9

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

例如Carbon使用静态方法:

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

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

我有以下控制器:

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

我如何将碳传递给它?

4

1 回答 1

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

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

于 2016-12-16T13:31:27.957 回答