如何通过服务容器将参数传递给构造函数?

时间:2016-03-23 11:53:37

标签: php laravel dependency-injection laravel-5

我有一个可以回复调用第三方付款解决方案的课程。

作为其中的一部分,存在各种商家id /共享秘密参数。 论文将取决于谁登录了该应用程序。

我正在使用的类在构建类时在构造函数中获取此信息。有没有办法在服务提供商中传递这个,可能是这样的:

 $this->app->bind( 'App\BokaKanot\Interfaces\BillingInterface',function ($merchantId)
 {
    return new KlarnaBilling($merchantId);
 } );

如果是这样,是否仍然可以通过构造函数执行此操作,或者我是否需要手动使用App:make。如果我必须使用App::make,我怎么能不在调用类中隐藏它?

或者我应该重构我在构造函数中不需要它的类,并且可能有一个init方法?

2 个答案:

答案 0 :(得分:2)

您可以将参数传递给App::make并将参数传递给构造函数,如下所示:

$this->app->bind( 'App\BokaKanot\Interfaces\BillingInterface',
                   function( $app, array $parameters)
{
    //call the constructor passing the first element of $parameters
    return new KlarnaBilling( $parameters[0] );
} );

//pass the parameter to App::Make
App::make( 'App\BokaKanot\Interfaces\BillingInterface',  [ $merchantId ]  );

答案 1 :(得分:2)

在laravel 5.4(https://github.com/laravel/framework/pull/18271)上,您需要使用IoC容器的makeWith方法。

inp = [1 0 1; 0 0 0; 1 1 0];          %Input matrix
C = nchoosek(1:size(inp,1),2);        %Number of rows taken 2 at a time
out = inp(C(:,1),:) .* inp(C(:,2),:); %Multiplying those rows to get the desired output

如果您仍然使用5.3或更低版本,上述答案将起作用