将依赖关系参数传递给Laravel中的App :: make()或App :: makeWith()

问题描述 投票:6回答:2

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

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

$objMyClass = new MyClass($objDependency);

如何通过Laravel中的Service Container实现这一目标?这是我尝试过的方法,但对我来说似乎不对。在我的AppServiceProvider中:

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

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

    return new MyClass($objDependency);
}

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

$objMyClass = App:make('MyClass', [
    'something'     => $something, 
    'somethingElse' => $somethingElse
]);

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

谢谢

php laravel laravel-5 ioc-container
2个回答
11
投票

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

这样完成:

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

或使用app()帮助器

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

这是基本,将数组键设置为参数变量名称,否则将被忽略。因此,如果您的代码期望使用名为$ modelData的变量,则数组键必须为'modelData'。

$api = app()->makeWith(HelpSpot\API::class, ['modelData' => $modelData]);

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


3
投票

您也可以这样操作:

$this->app->make(SomeClass::class, ["foo" => 'bar']);
© www.soinside.com 2019 - 2024. All rights reserved.