2016-07-05 87 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

是的,我需要的是單身。那麼如何執行依賴注入呢? –