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

use*_*427 7 php laravel laravel-routing

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

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

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

public/test/id=1&page=2&opt=1
or 
public/test/id=1/page=2/opt=1
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助

Raz*_*zor 8

如果您有多个可选参数

Route::get('test',array('as'=>'test','uses'=>'HomeController@index'));
Run Code Online (Sandbox Code Playgroud)

在你的控制器里面

 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
       //...
    }
 }
Run Code Online (Sandbox Code Playgroud)


ale*_*ell 6

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

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

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

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

这是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
});
Run Code Online (Sandbox Code Playgroud)

并不是说这是一个非常天真的解决方案,依靠盲目爆炸=以及设置任意输入变量的名称(这显然是在寻找麻烦).您应该为此代码添加更多检查,但它应该让您了解如何克服上述两个问题.

应该注意的是,这有点违背了在Laravel中执行路由和URI的"正确方法",所以除非你真的需要这个功能,否则你应该重新思考将这些URI形成为Laravel框架的方式.更多的设置.