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

2022-08-30 18:23:33

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

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

$objMyClass = new MyClass($objDependency);

如何通过 Laravel 中的服务容器实现此目的?这是我尝试过的,但这对我来说似乎是错误的。在我的 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
]);

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

谢谢


答案 1

您可以在此处查看详细文档: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 实例。


答案 2

您也可以通过以下方式执行此操作:

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

推荐