构造函数注入路由参数

时间:2016-02-08 09:20:10

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

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

路由

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

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

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

我想我最终会得到像这样的东西

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

1 个答案:

答案 0 :(得分:4)

您可以使用$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并从中检索值。然后,如果您更改路由参数的名称,或者需要从路由以外的其他位置解析它,则只需更改该提供程序的实现。

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