2016-02-08 227 views
4

我有一个类,我正在注入一个控制器以及一个路由参数。然后我使用setter来设置类中的路由参数。构造函数注入路由参数

路线

Route::get('path/of/url/with/{paramVar}', '[email protected]) 

控制器

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'); 
} 

我反而喜欢路线参数注入类的构造函数,我注入我的控制器。我知道我需要使用laravel容器的from this question

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

我想我会落得这样的

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

你能举一些例子吗?或者显示完整的testController代码? – smartrahat

+0

我已更新该问题并提供更多信息 – myol

回答

3

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

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

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

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

    }); 
} 

在问候您的评论,也不会减少代码不多,但它可能是在这种情况下,最好进行第二次服务:

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

在您的服务提供商

所以提供者,像FooValueServiceProvider谁的实现的唯一工作是从路由器检索该参数。然后在每个绑定中,您可以解析一个FooValueServiceProvider并从中检索值。然后,如果稍后更改了路由参数的名称,或者需要从路由以外的地方解析它,则只需更改该提供程序的实现。

我不知道你是否可以获得比每绑定一行额外代码更有效的方法,但至少可以通过这种方式将其更改为不同的方法。

+0

感谢Jeff,此工作非常完美。在使用此单一参数进行装载时,如何减少代码量,您有任何建议吗? (但返回不同的混凝土) – myol

+0

@myol更新了我的想法! – Jeff

+0

有趣的想法杰夫,谢谢 – myol