依赖注入在Laravel 5.2中的迁移文件中不起作用

时间:2016-07-05 23:53:15

标签: laravel laravel-5 laravel-5.2

我试图在特定班级使用单身人士。

我在" AppServicePrvider.php"中使用以下内容轻松地完成了这项工作:

<?php

namespace App\Providers;

use App\Helpers\ApplicationFormHelper;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    public function boot()
    {

    }

    public function register()
    {
        $this->app->singleton(ApplicationFormHelper::class, function ($app) {
            return new ApplicationFormHelper();
        });
    }
}

然后我将此类包含在我的迁移文件中,如下所示:

<?php

use App\Helpers\ApplicationFormHelper;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateUsersTable extends Migration
{
    private $applicationFormHelper;

    public function __construct(ApplicationFormHelper $applicationFormHelper)
    {
        $this->applicationFormHelper = $applicationFormHelper;
    }

    public function up()
    {
        //...
    }

    public function down()
    {
        Schema::drop('users');
    }
}

然而,当我执行php artisan migrate时,我收到以下错误,表明依赖注入不起作用。

 [Symfony\Component\Debug\Exception\FatalThrowableError]                                                             
  Type error: Argument 1 passed to CreateUsersTable::__construct() must be an instance of App\Helpers\ApplicationFor  
  mHelper, none given, called in /home/vagrant/saroia/vendor/laravel/framework/src/Illuminate/Database/Migrations/Mi  
  grator.php on line 335   

请注意,我已经将此类用于其他地方(例如在路径文件中)没有问题。似乎仅在迁移文件中存在此问题!

2 个答案:

答案 0 :(得分:5)

正如@lagbox所提到的,IoC容器似乎无法解析迁移文件。

但是仍然可以使用app make方法解决它们,如下所示:

<?php

use App\Helpers\ApplicationFormHelper;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateUsersTable extends Migration
{
    private $applicationFormHelper;

    public function __construct()
    {
        $this->applicationFormHelper = app(ApplicationFormHelper::class);
    }

    public function up()
    {
        //...
    }

    public function down()
    {
        Schema::drop('users');
    }
}

答案 1 :(得分:1)

不通过IoC解析迁移文件。它们是从普通的php&#39; new&#39;机制。由于它们没有从IoC解决,因此不涉及依赖注入。

此外,您不需要将类绑定到容器以允许IoC能够解析它。 IoC会随时尝试解决任何课程。

  

&#34;但是,如果不依赖于任何接口,则无需将类绑定到容器中。不需要指示容器如何构建这些对象,因为它可以自动解决这些&#34;具体的问题。使用PHP的反射服务的对象。&#34;

Laravel 5.2 - Service Container - Binding

因此,除非你真的需要一个单例,否则你不必为IoC声明任何绑定来解析该特定类。