在Laravel 5中将路由器注入控制器方法

时间:2014-12-07 13:39:45

标签: php laravel dependency-injection laravel-5

有谁知道为什么不能在Laravel 5中使用控制器方法注入来使控制器方法中的$ router单例可用,如下面的代码所示?

use Illuminate\Routing\Router;

class WelcomeController extends Controller {
    // ...
    public function test($name = 'default var value', Router $router)
    {
        // stuff like taking the {name} part of /say-hello-to/{name?}
        // ...using $router->input('name') for example
        // ...assuming a route like: Route::get('say-hello-to/{name?}', 'WelcomeController@test') 
    }
}

另一种获取相同内容的方法(对控制器方法中的url部分的惯用访问)很有用,但我已经想到了一种方法来做到这一点我主要感兴趣的是为什么这样做不仅仅是工作,因为我想要的是更深入地理解Laravel的工作原理以及使用它时可以使用的高级模式

1 个答案:

答案 0 :(得分:2)

好吧,我在约5分钟后自己想出答案后首先考虑删除这个,但是再说一遍,也许最好把这个写给其他人以便能够谷歌:

将可选的URL参数(如'test/{name?}')与控制器方法注入相结合时,始终将注入的参数放在方法声明中的默认值之前,否则最终会凝视在没有可选参数的情况下访问URL变体时出现一些非常混乱的错误。

所以,在上面的例子中,应该是:

public function test(Router $router, $name = 'default var value')

...而不是:

public function test($name = 'default var value', Router $router)

顺便说一句,如果有人比Laravel更有经验的人遇到这个,请评论一下你是否认为这是一个应该向开发者报告的Laravel 5错误,或者如果你认为这是针对这种情况的预期行为