【问题标题】:Dependency injection: Unable to inject Carbon class in custom-helper class in laravel application依赖注入:无法在 laravel 应用程序的自定义助手类中注入 Carbon 类
【发布时间】:2015-03-10 01:26:06
【问题描述】:

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

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

'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。

启发我..

【问题讨论】:

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


    【解决方案1】:

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

    $myHelper = new MyHelper();
    

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

    $myHelper = new MyHelper($carbon);
    

    编辑: Laravel 有一个 Inversion of control,它的用法是这样的:

    class FooBar {
    
        public function __construct(Baz $baz)
        {
            $this->baz = $baz;
        }
    
    }
    
    $fooBar = App::make('FooBar');
    

    (取自here

    需要使用make 方法而不是纯PHP 构造函数调用。 Laravel 应该在后台正确调用构造函数。

    【讨论】:

    • 在 Laravel 中进行依赖注入的全部目的不是为了避免手动传递依赖的类/对象吗?如果我像上面提到的那样通过传递 Carbon 对象作为参数来实例化 MyHelper 类,它看起来很手动。
    • 在 PHP 中,如果你有一个需要参数的函数,那么你需要传递那个参数。
    • 是的,我知道,它在 PHP 中是必需的。但问题是我正在使用 Laravel 创建我的应用程序,而 Laravel 提供了一种称为控制反转的东西,我希望它应该自动解析这些类。
    • 如何实例化类?
    • 看看这里:laravel.com/docs/4.2/ioc 使用类似 App::make('foo'); 的代码进行实例化。它在后台调用带有所需参数的构造函数。但是您正在使用 new 关键字进行实例化,该关键字是纯 PHP 并需要一个 Carbon 参数,就像我的回答一样。
    【解决方案2】:

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

    use Carbon\Carbon;
    
        class MyClass{
    
            protected $today;
    
            public function __construct(Carbon $carbon){
                $this->today = $carbon->now();
            }
    
        }
    

    【讨论】:

    • 这真的没有任何意义。我正在使用别名,以便我可以在依赖注入期间使用别名。
    • 无论如何,我尝试了您的解决方案,但没有成功。
    • 好的。您如何称呼 MyHelper。将此复制到 global.php 或 routes.php(您可以稍后移动)App::bind('MyHelper', function($app) { return new App\Lib\MyHelper($app->make('Carbon\Carbon')); });
    猜你喜欢
    • 2014-02-02
    • 2023-03-31
    • 2014-12-17
    • 1970-01-01
    • 1970-01-01
    • 2023-01-30
    • 2021-11-14
    • 2017-04-10
    • 1970-01-01
    相关资源
    最近更新 更多