【问题标题】:Passing dependency parameters to App::make() or App::makeWith() in Laravel在 Laravel 中将依赖参数传递给 App::make() 或 App::makeWith()
【发布时间】:2016-10-19 01:59:36
【问题描述】:

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

$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
]);

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

谢谢

【问题讨论】:

  • 是的,这是正确的方法,这是 Laravel 的一种工厂设计模式实现。这段代码有什么困扰你的地方?
  • 谢谢 - 我不确定,我还在了解 Laravel,只是不确定设置依赖项的参数是否正确。再次感谢
  • 你可以直接在构造函数中注入你的依赖。

标签: php laravel laravel-5 ioc-container


【解决方案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 实例。

【讨论】:

  • 确保您做的一件事是将参数名称作为数组键传递。我没有这样做,它默默地失败了,调试起来并不有趣!
  • @MatthewInamdar 哇,我希望我能早点看到你的评论!这让我发疯了!
【解决方案2】:

你也可以这样做:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 2011-01-13
    • 1970-01-01
    • 2019-01-01
    • 2015-02-24
    • 1970-01-01
    相关资源
    最近更新 更多