【问题标题】:Constructor injection of route parameter路由参数的构造函数注入
【发布时间】:2016-02-11 00:35:30
【问题描述】:

我有一个类与路由参数一起注入到控制器中。然后我使用 setter 在类中设置路由参数。

路线

Route::get('path/of/url/with/{paramVar}', 'testController@testFunc)

控制器

class testController
{
    public function testFunc(MyClassInterface $class, $routeParamVar)
    {
        $class->setParam($routeParamVar);
        //do stuff here
        ...

服务提供商

public function register()
{
    $this->bind('path\to\interface', 'path\to\concrete');
}

我想将路由参数注入到我要注入控制器的类的构造函数中。我知道from this question 我需要使用 laravel 容器。

我可以使用Request::class注入其他路由参数,但是如何注入路由路径参数呢?

我想我最终会得到这样的结果

class testController
{
    public function testFunc(MyClassInterface $class)
    {
        //do stuff here
        ...

【问题讨论】:

  • 你能举个例子吗?或者显示完整的 testController 代码?
  • 我已经用更多信息更新了问题

标签: laravel dependency-injection laravel-5 laravel-5.2


【解决方案1】:

您可以使用$router->input('foo') 函数在您的服务容器中检索路由参数。

https://laravel.com/api/master/Illuminate/Routing/Router.html#method_input

所以在您的服务提供商中:

public function register()
{
    $this->bind('path\to\interface', function(){

        $param = $this->app->make('router')->input('foo');

        return new path\to\concrete($param);

    });
}

关于您的评论,它不会减少太多代码,但在这种情况下,最好创建第二个服务提供者,例如 FooValueServiceProvider,其实现的唯一工作就是从路由器中检索该参数.然后在每个绑定中,您可以解析 FooValueServiceProvider 并从中检索值。然后稍后如果您更改路由参数的名称,或者需要从路由以外的其他地方解析它,您只需要更改该提供程序的实现。

我不知道您是否可以比每次绑定多一行代码更有效率,但至少这样可以将其更改为不同的方法。

【讨论】:

  • 谢谢杰夫,这很好用。当有大量绑定采用此单个参数时,您对如何减少代码量有任何建议吗? (但返回不同的混凝土)
  • 我假设如果你走这条路,你必须手动注入其余的依赖项(因为容器将不再自动解析它们?)
  • @myol 嗯我不明白你的意思。您总是必须在服务提供者中手动建立与 $app->make() 的依赖关系,但在其他任何地方(控制器、模型等),您都可以键入提示接口并接收使用 $param 构造的具体类。跨度>
  • 我应该澄清一下 - 如果一个类有 3 个由容器自动解析的依赖项,那么当您显式注入第四个依赖项时,您似乎还必须显式注入剩余的依赖项。这是正确的还是有办法让容器仍然可以自动解决剩余的依赖关系?
  • 您能否提供一个链接或示例,说明自动解析依赖项与手动注入的依赖项的含义?
猜你喜欢
  • 1970-01-01
  • 2015-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-27
相关资源
最近更新 更多