【问题标题】:Laravel: injecting a custom class in a Command classLaravel:在命令类中注入自定义类
【发布时间】:2018-07-18 11:02:23
【问题描述】:

我遇到了一个问题,我有一个自定义类 app/TicketFetcher,被注入到 App\Console\Commands/TicketFetch 类的构造函数中,但我不确定如何注入 TicketFetcher 的特定实例,其中它接受构造函数参数,没有错误。

这些类的实例化似乎由 Laravel 的服务容器处理,因为当 TicketFetcher 的构造函数没有参数时,它会自动注入我的自定义类的实例。有争论就会出现问题。

设置:

class TicketFetch extends Command
{
    // $ticketFetcher injected automatically
    public function __construct(TicketFetcher $ticketFetcher)
}

class TicketFetcher
{
    public function __construct(integer $var1, string $var2...) {
}

如你所见,我需要为TicketFetcher构造一些初始化变量,所以我将TicketFetcher绑定在AppServiceProvider中。

Unresolvable dependency resolving [Parameter #0 [ <required> string $var1 ]] in class App\TicketFetcher

class AppServiceProvider extends ServiceProvider
{
    public function register()
    {
        // Also tried $this->app->instance() and
        // $this->app->when('\App\TicketFetcher')->needs(...)->give(...)
        $this->app->bind(
            '\App\TicketFetcher', 
            new \App\TicketFetcher('some value')
        );
    }
}

我让some value 传递到TicketFetcher 的构造函数,但仍然出现错误。

Unresolvable dependency resolving [Parameter #0 [ <required> string $var1 ]] in class App\TicketFetcher 

如何正确绑定它,以便正确创建TicketFetcher

【问题讨论】:

  • 刚刚意识到$this-&gt;app-&gt;when('App\TicketFetcher') 实际上是正确的做法。注意when().. 中没有前导斜杠!如何绑定多个原语? laravel.com/docs/5.5/container#binding
  • TicketFetcher::class 也可以,前提是首先通过use 导入该类

标签: laravel dependency-injection ioc-container laravel-5.5


【解决方案1】:

事实证明,我尝试的一种方法是正确/有效的。

$this->app->when('App\TicketFetcher')->needs('$var1')->give('some value');
$this->app->when('App\TicketFetcher')->needs('$var2')->give([1, 2]);

注意缺少前导斜杠。这就是所谓的binding a primitive,如字符串、数组等。您对每个参数重复它。

我仍然想知道是否有其他方法可以做到这一点,因为对于一个更大的项目来说,这似乎会变得非常冗长。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-14
    • 2015-09-25
    • 2015-03-10
    • 2018-10-04
    • 2014-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多