我是laravel的新手,我真的很难理解如何传递多个可选的url参数。
将3个可选参数传递给控制器时,将路径编码的标准方法是什么?
还有一种方法可以编写路由以允许将命名参数传递给控制器吗?
,例如
public/test/id=1&page=2&opt=1
or
public/test/id=1/page=2/opt=1
感谢您的帮助
答案 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
在这里都是可选的,由段定义中的?
定义,并且它们在函数中具有默认值。但是,你会注意到这里存在一些问题:
$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
});
这不是一个非常天真的解决方案,依靠=
的盲目爆炸以及设置任意输入变量的名称(这显然是在寻找麻烦)。您应该为此代码添加更多检查,但它应该让您了解如何克服上述两个问题。
应该注意的是,这有点违背了在Laravel中进行路由和URI的“正确方式”,所以除非你真的需要这个功能,你应该重新思考你的形成方式这些URI是Laravel框架更适合设置的方式。