Laravel 4:如何传递多个可选参数

8
我是新手,正在学习 Laravel ,我很难理解如何传递多个可选的 URL 参数。
当将三个可选参数传递给控制器时,标准的路由编码方式是什么?
此外,是否有一种方法可以编写路由以允许命名参数传递给控制器?
例如:
public/test/id=1&page=2&opt=1
or 
public/test/id=1/page=2/opt=1

感谢您的帮助。

1
id=1&page=2&opt=1 是向服务器传递参数的经典、老旧方式;而 id/1/page/2/opt/1 则是新的框架方式。 - Andrew Koper
这个技术叫什么名字,安德鲁?谢谢。 - clarenswd
2个回答

8
如果您有多个可选参数。
Route::get('test',array('as'=>'test','uses'=>'HomeController@index'));

在你的控制器中,
 class HomeController extends BaseController {
    public function index()
    {
       // for example public/test/id=1&page=2&opt=1
       if(Input::has('id'))
           echo Input::get('id'); // print 1
       if(Input::has('page'))
           echo Input::get('page'); // print 2
       //...
    }
 }

7

命名参数通常作为路由段而不使用明确的名称。例如,你可以这样做:

Route:get('test/{id?}/{page?}/{opt?}', function ($id = null, $page = null, $opt = null) {
    // do something
});

$id$page$opt都是可选的,因为在段定义中使用了?符号,而且它们在函数中有默认值。然而,你会发现这里存在一个问题:

  1. 它们必须按正确的顺序出现在URL中
  2. 只有$opt是真正可选的,如果提供了$opt,则必须提供$page,如果提供了$page,则必须提供$id

这是由于Laravel将命名段映射到函数/方法参数的方式所带来的限制。理论上,您可以实现自己的逻辑使其工作,但是:

Route:get('test/{first?}/{second?}/{third?}', function ($first = null, $second = null, $third = null) {
    if ($first) {
        list($name, $value) = @explode('=', $first, 2);
        $$name = $value;
    }
    if ($second) {
        list($name, $value) = @explode('=', $second, 2);
        $$name = $value;
    }
    if ($third) {
        list($name, $value) = @explode('=', $third, 2);
        $$name = $value;
    }

    // you should now have $id, $page and $opt defined if they were specified in the segments
});

这并不是一个非常简单的解决方案,它依赖于=的盲目爆炸以及设置任意输入变量的名称(这显然会引起麻烦)。您应该向此代码添加更多检查,但它应该可以给您提供如何解决上述两个问题的想法。

应该注意,这有点违背了在Laravel中进行路由和URI的“正确方法”,因此除非您真正需要此功能,否则应重新考虑形成这些URI的方式,以使用Laravel框架更好地设置。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接