在Laravel中将依赖参数传递给App :: make()

jd1*_*182 5 php ioc-container laravel laravel-5

我认为这应该很容易,但是我正在努力弄清楚它应该如何工作。

我有一个使用依赖项的类。我需要能够根据控制器的依赖关系动态设置参数:

$objDependency = new MyDependency();
$objDependency->setSomething($something);
$objDependency->setSomethingElse($somethingElse);

$objMyClass = new MyClass($objDependency);
Run Code Online (Sandbox Code Playgroud)

如何通过Laravel中的服务容器实现此目标?这是我尝试过的方法,但对我来说似乎不对。在我的AppServiceProvider中:

$this->app->bind('MyClass', function($app,$parameters){

    $objDependency = new MyDependency();
    $objDependency->setSomething($parameters['something']);
    $objDependency->setSomethingElse($parameters['somethingElse']);

    return new MyClass($objDependency);
}
Run Code Online (Sandbox Code Playgroud)

然后在控制器中,我将这样使用:

$objMyClass = App:make('MyClass', [
    'something'     => $something, 
    'somethingElse' => $somethingElse
]);
Run Code Online (Sandbox Code Playgroud)

它是否正确?有没有更好的方法可以做到这一点?

谢谢

rea*_*lay 9

您可以在此处查看详细的文档:https : //laravel.com/docs/5.6/container#the-make-method

这样做是这样的:

$api = $this->app->makeWith('HelpSpot\API', ['id' => 1]);
Run Code Online (Sandbox Code Playgroud)

或使用app()助手

$api = app()->makeWith(HelpSpot\API::class, ['id' => 1]);
Run Code Online (Sandbox Code Playgroud)

注意:如果将其用于模拟,makeWith不会返回Mockery实例。

  • 需要确保做的一件事是将参数名称作为数组键传递。我没有这样做,它默默地失败了,这调试起来并不有趣! (2认同)

wir*_*d00 8

你也可以这样做:

$this->app->make(SomeClass::class, ["foo" => 'bar']);
Run Code Online (Sandbox Code Playgroud)