路由参数的构造函数注入
Constructor injection of route parameter
我有一个 class,我将其连同路由参数一起注入到控制器中。然后我使用 setter 在 class.
中设置路由参数
路线
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');
}
我想将路由参数注入到 class 的构造函数中,我正在注入我的控制器。我知道 我需要使用 laravel 容器。
我可以使用Request::class
注入其他路由参数,但是如何注入路由路径参数?
我想我最终会得到这样的结果
class testController
{
public function testFunc(MyClassInterface $class)
{
//do stuff here
...
您可以使用 $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
并从中检索值。然后,如果您更改路由参数的名称,或者需要从路由以外的其他地方解析它,您只需要更改该提供程序的实现即可。
我不知道你是否可以获得比每个绑定多一行代码更高效的方法,但至少这样可以将其更改为不同的方法。
我有一个 class,我将其连同路由参数一起注入到控制器中。然后我使用 setter 在 class.
中设置路由参数路线
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');
}
我想将路由参数注入到 class 的构造函数中,我正在注入我的控制器。我知道
我可以使用Request::class
注入其他路由参数,但是如何注入路由路径参数?
我想我最终会得到这样的结果
class testController
{
public function testFunc(MyClassInterface $class)
{
//do stuff here
...
您可以使用 $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
并从中检索值。然后,如果您更改路由参数的名称,或者需要从路由以外的其他地方解析它,您只需要更改该提供程序的实现即可。
我不知道你是否可以获得比每个绑定多一行代码更高效的方法,但至少这样可以将其更改为不同的方法。