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

6

我有一个负责调用第三方支付解决方案的类。

作为其中的一部分,有各种商户ID/共享密钥参数。这些将取决于谁登录了应用程序。

我正在使用的类在构建类时通过构造函数接收此信息。是否有一种方法可以通过服务提供者传递此信息,例如:

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

如果需要这样做,是否仍然可以通过构造函数来实现,还是我需要手动使用App:make。如果必须使用App::make,那么如何不将其隐藏在我的调用类中?或者,我应该重构我正在使用的类,使其不需要在构造函数中这样做,并且可能有一个初始化方法?
2个回答

5
您可以通过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 ]  );

谢谢!我可以在控制器中使用App:make,然后在下面的方法中请求一个实例,但是有没有办法将实例作为参数传递给构造函数?如果可以的话,应该把App:make放在哪里?在router.php中吗? - Positonic
@iKode:抱歉,我不理解你的问题。你能否通过编辑你的问题给出一个具体的例子来说明你想要实现什么? - Moppo

5
在laravel 5.4版本(https://github.com/laravel/framework/pull/18271)中,您需要使用IoC容器的makeWith方法。
App::makeWith( 'App\MyNameSpace\MyClass',  [ $id ]  );

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


在Laravel 5.5中,您仍然可以使用make('Class', $data)方法,我认为该方法已经恢复。 - Hanlin Wang

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接