2015-04-17 270 views
8

我建立一個Laravel項目,並在控制器我注入兩個依賴的方法之一:PHP - Laravel依賴注入:傳遞參數進行依賴構造

public function pusherAuth(Request $request, ChannelAuth $channelAuth) { ... } 

我的問題是非常簡單的:如何將參數傳遞給$channelAuth依賴項?

目前我使用一些制定者傳遞所需的依賴:

public function pusherAuth(Request $request, ChannelAuth $channelAuth) 
{ 
    $channelAuth 
     ->setChannel($request->input('channel')) 
     ->setUser(Auth::user()); 

有什麼選擇這種方法?

P.S.代碼需要可測試。

回答

7

感謝我在Laracast discussion收到的幫助,我能夠回答這個問題。使用服務提供者可以通過將正確的參數傳遞給構造函數來初始化依賴項。這是我創建的服務提供商:

<?php namespace App\Providers; 

use Security\ChannelAuth; 
use Illuminate\Contracts\Auth\Guard; 
use Illuminate\Http\Request; 
use Illuminate\Support\ServiceProvider; 

class ChannelAuthServiceProvider extends ServiceProvider { 

    /** 
    * Bootstrap the application services. 
    * 
    * @return void 
    */ 
    public function boot() 
    { 
     // 
    } 

    /** 
    * Register the application services. 
    * 
    * @return void 
    */ 
    public function register() 
    { 
     $this->app->bind('Bloom\Security\ChannelAuthInterface', function() 
     { 
      $request = $this->app->make(Request::class); 
      $guard = $this->app->make(Guard::class); 

      return new ChannelAuth($request->input('channel_name'), $guard->user()); 
     }); 
    } 
} 
+0

但是如果您的輸入沒有設置'channel_name'會怎麼樣?在您有機會驗證您的輸入之前,可能會調用此代碼。 – omarjebari

+0

@omarjebari我想這取決於你在哪裏注入'Bloom \ Security \ ChannelAuthInterface',在我的情況下,這是在輸入被驗證之後。 – siannone

0

您可以創建並註冊您自己的服務提供者,並使用構造函數的請求參數創建對象。

我不知道如何在Laravel做到這一點,但在Symfony2中,你可以在自己的服務像RequestStack注入。這是最好的方式,因爲您擁有完全可測試的小型服務提供商。