2016-07-05 88 views
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 

请注意,我已经使用这个类是其他地方(如在路径文件中)没有问题。似乎只有在迁移文件中存在此问题!

回答

1

正如@lagbox所提到的,迁移文件似乎没有被IoC容器解决。

但是仍然可以使用该应用的化妆方法,像这样来解决这些问题:

<?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

迁移文件未通过IoC解析。它们是从普通的php'new'机制创建的。由于它们未从IoC解析,因此不涉及依赖注入。

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

“但是,如果不依赖任何接口,则不需要将类绑定到容器中,因为容器不需要指示如何构建这些对象,因为它可以自动解析这种”使用PHP的反射服务的具体“对象。”

Laravel 5.2 - Service Container - Binding

所以,除非你真的需要一个单身,你没有申报任何约束力的国际奥委会来解决特定的类。

+0

是的,我需要的是单身。那么如何执行依赖注入呢? –