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

时间:2014-05-13 09:45:35

标签: php laravel laravel-routing

我是laravel的新手,我真的很难理解如何传递多个可选的url参数。

将3个可选参数传递给控制器​​时,将路径编码的标准方法是什么?

还有一种方法可以编写路由以允许将命名参数传递给控制器​​吗?

,例如

public/test/id=1&page=2&opt=1
or 
public/test/id=1/page=2/opt=1

感谢您的帮助

2 个答案:

答案 0 :(得分: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
       //...
    }
 }

答案 1 :(得分:6)

命名参数通常作为路径段完成,但没有明确命名。所以例如你可以这样:

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

$id$page$opt在这里都是可选的,由段定义中的?定义,并且它们在函数中具有默认值。但是,你会注意到这里存在一些问题:

  1. 他们必须以正确的顺序出现在网址
  2. 只有$opt才是真正的可选项,$page必须提供$opt$id必须是$page
  3. 这是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框架更适合设置的方式。