是否可以将路由参数传递给Laravel中的控制器构造函数


Is it possible to pass a route parameter to controller constructor in Laravel?

是否可以向控制器构造函数注入路由参数(或路由段)?

你可以找到一些代码来澄清我的问题。

class TestController{
    protected $_param;
    public function __construct($paramFromRoute)
    {
        $this->param = $paramFromRoute;
    }
    public function testAction()
    {
        return "Hello ".$this->_param;
    }
}
----------------------------------------------------
App::bind('TestController', function($app, $paramFromRoute){
    $controller = new TestController($paramFromRoute);
    return $controller;
});
----------------------------------------------------
// here should be some magic
Route::get('foo/{bar}', 'TestController'); 

不可能注入它们,但您可以通过:访问所有它们

class TestController{
    protected $_param;
    public function __construct()
    {
        $id = Route::current()->getParameter('id');
    }
}

Laravel 5.3.28

无法注入参数。。。但是,您可以注入请求并从路由器实例中获取,如下所示:

//route: url_to_controller/{param}
public function __construct(Request $request)
{
   $this->param = $request->route()->parameter('param');
}

Laravel 5.4中,您可以使用它来请求参数:

public function __construct(Request $request) {
   $id = $request->get("id");
}

更新LARAVEL 8

可以使用route()方法从laravel 8:的路由url参数中获取值

$id = request()->route('id')

如果您想要一个更可测试的解决方案,可以使用服务提供商的功能。

        $this->app->bind(TestController::class, function ($app) {
            return new TestController(request()->testParam);
        });

最后,但最重要的是,您可以简单地在容器解析的类的构造函数中"键入提示"依赖项,包括控制器、事件侦听器、队列作业、中间件等等。在实践中,这就是容器解析大多数对象的方式。

http://www.golaravel.com/laravel/docs/5.1/container/