2

我正在尝试将 Artisan 注入到服务中,这样我就可以避免使用外观。查看外观类参考,我可以看到我应该注入的类是:

Illuminate\Console\Application

所以我会假设这样做:

<?php

namespace App\Service;

use Illuminate\Console\Application;

class DummyDataService
{
    /**
     * @var Application
     */
    private $application;

    public function __construct(
        Application $application
    ) {
        $this->application = $application;
    }

    public function insertDummyData()
    {
        $this->application->call('db:seed', [
            '--class' => 'DummyDataSeeder'
        ]);
    }
}

...会工作。但是,我收到以下错误:

BindingResolutionException in Container.php line 824:
Unresolvable dependency resolving [Parameter #2 [ <required> $version ]] in class Illuminate\Console\Application

如果我像这样调用外观上的方法,它就可以工作:

Artisan::call('db:seed', [
    '--class' => 'DummyDataSeeder'
]);

到目前为止,我无法弄清楚问题出在哪里。有没有人遇到过类似的问题?我尽量避免使用外墙。

提前致谢。

4

2 回答 2

4

你应该注入Illuminate\Contracts\Console\Kernel而不是Illuminate\Console\Application实现你想要的,所以你的类应该是这样的:

<?php

namespace App\Service;

use Illuminate\Contracts\Console\Kernel;

class DummyDataService
{
    private $kernel;

    public function __construct(Kernel $kernel) 
    {
        $this->kernel = $kernel;
    }

    public function insertDummyData()
    {
        $this->kernel->call('db:seed', [
            '--class' => 'DummyDataSeeder'
        ]);
    }
}
于 2015-11-23T19:27:12.430 回答
1

如果您看一下构造函数,Illuminate\Console\Application您会发现它需要一个$version参数并且不提供任何类型的默认值。因此,如果没有显式提供一个,它将因为这种依赖关系而失败。老实说,这对我来说似乎是一个错误。如果您查看它的 Symphony 父类,您会发现它'UNKNOWN'在其构造函数中提供了一个默认字符串 of。如果您修改Illuminate\Console\Application为具有相同的默认值,则代码中的命令现在应该可以工作了。

这使您有两个选择。

  1. 只需在此实例中使用 Artisan 外观即可。对其余的门面使用构造函数注入应该没问题,因为这会特别影响 Artisan 门面。
  2. 将源代码中的构造函数更改为具有默认值。不理想,因为每次更新 Laravel 时所有更改都会丢失,但这是一种选择。您也许可以创建某种服务提供程序,将一个版本也注入所有Illuminate\Console\Application实例,但我不确定。

老实说,我不确定将默认值添加到构造函数中是否会产生不可预见的后果,尽管我认为它们将是最小的,因为它必须在任何被调用的地方明确定义。我什至可以把它做成公关,看看泰勒是评论它还是只是合并它。

于 2015-11-23T19:14:10.530 回答