【问题标题】:Getting the nth route parameter in a controller在控制器中获取第 n 个路由参数
【发布时间】:2018-01-11 09:42:35
【问题描述】:

我在 routes.php 中定义了一个类似于:

Route::get('something/{firstId}/{secondId}/{thirdId}/{nthId}', 'SomeController@read')->name('read');

在我的控制器中,我的设置是这样的,效果很好:

public function read($firstId, $secondId, $thirdId, $nthId, Request $request){
   ...
}

对于特定方法,我不需要 $firstId$secondId 等。我只需要$nthId。是否可以设置我的控制器,以便我可以获取第 n 个参数并简化我的代码?例如:

public function read($nthId, Request $request){
   ...
}

【问题讨论】:

  • 路由中必须加上id,如果使用数组输入字段会更容易。
  • 在方法中省略参数将是一个糟糕的设计。如果另一个开发人员正在研究它会怎样。他们怎么会知道这些?在开发代码时问问自己。
  • @Ohgodwhy 这是一个非常好的观点,但通常在使用控制器时,我假设未来的开发人员也会查看路由定义。无论如何,这就是我所希望的。拥有一个不需要几个参数的控制器对我来说似乎很奇怪,但现在我正在考虑重构路由。本质上,我的路线真的需要那么深吗?

标签: laravel laravel-5.2 laravel-routing


【解决方案1】:

您可以使用 variadic 设置参数列表 ... 在 php.net arguments page 上有一个有趣的标题,就是这样:

因此,在您的情况下,您将拥有:

public function read(Request $request, ...$ids){
   $id2 = $ids[1]; //here is the second path parameter in /id1/id2/id3/..n
   ...
}

一件事是可变参数必须在声明的最后。

Ps:关于注入其他参数,我可能并不完全正确,但至少在上面的示例中,它可以正常工作。

【讨论】:

  • 不错,没想到用“...”!唯一要记住的是,先保留服务提供者注入的东西。即将 $request 和其他对象移到前面,例如: public function read(Request $request, SomeOtherServiceProvider $service, ...$routeParameters)
  • @Foo,检查我的更新,实际上你的想法是正确的,它会像你说的那样工作
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-21
  • 2013-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多