2015-04-17 215 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注入。这是最好的方式,因为您拥有完全可测试的小型服务提供商。