依赖注入:无法在laravel应用程序中的custom-helper类中注入Carbon类

时间:2015-01-12 09:57:05

标签: php laravel laravel-4 dependency-injection inversion-of-control

我创建了一个app\lib文件夹来保留我的自定义助手类。我将它添加到composer.json中的autoload并运行composer dump-autoload
为了测试目的,我快速创建了一个名为MyHelper的类,并尝试实例化它,它确实按预期工作。自定义助手类很好地加载。

在我的申请中,我需要处理日期。所以我选择在Carbon扩展的帮助下工作日期。我发现它已经在Laravel供应商文件夹中了。
为了方便起见,我在alias中添加了app.php

'Carbon' => 'Carbon\Carbon'

以下是 custom helper class 。 (以下代码工作正常)

class MyHelper{

public $today;

public function __construct(){
    $this->today = Carbon::now();
}

在上面的代码中,我通过Carbon::now()创建了一个碳对象。这似乎没问题并且工作正常但据我所知,最好是进行依赖注入而不是在构造方法中实例化。这将使测试更容易。

所以我修改了上面的构造方法如下:

public function __construct(Carbon $carbon){
    $this->today = $carbon->now();
}

但是,上面的代码不起作用。并且错误报告告诉我构造方法的参数必须是Carbon \ Carbon的实例。

  

传递给Date :: __ construct()的参数1必须是。的实例   碳\碳,没有给出

我还添加了use Carbon\Carbon as Carbon但没有喜悦。我想我误解了Laravel的一些简单逻辑。可能是依赖注入或解决类的IOC的误解。

启发我..

2 个答案:

答案 0 :(得分:2)

您似乎在实例化MyHelper时遇到了问题。确保将Carbon传递给构造函数。我相信你有类似

的东西
$myHelper = new MyHelper();

但是,构造函数需要Carbon参数。假设$carbonCarbon个实例,您可以执行以下操作:

$myHelper = new MyHelper($carbon);

编辑: Laravel有一个控制反转,使用如下:

class FooBar {

    public function __construct(Baz $baz)
    {
        $this->baz = $baz;
    }

}

$fooBar = App::make('FooBar');

(摘自here

需要使用make方法而不是纯PHP构造函数调用。 Laravel应该在引擎盖下正确地调用构造函数。

答案 1 :(得分:0)

请删除别名并尝试 不确定是否需要添加别名,因为你想注入

use Carbon\Carbon;

    class MyClass{

        protected $today;

        public function __construct(Carbon $carbon){
            $this->today = $carbon->now();
        }

    }