Laravel 4:如何传递多个可选参数
Posted
技术标签:
【中文标题】Laravel 4:如何传递多个可选参数【英文标题】:Laravel 4 : How to pass multiple optional parameters 【发布时间】:2014-06-30 22:15:14 【问题描述】:我是 laravel 的新手,我真的很难理解如何传递多个可选的 url 参数。
向控制器传递 3 个可选参数时,编码路由的标准方法是什么?
还有没有办法编写一个路由来允许将命名参数传递给控制器?
如
public/test/id=1&page=2&opt=1
or
public/test/id=1/page=2/opt=1
感谢您的帮助
【问题讨论】:
id=1&page=2&opt=1 是向服务器传输参数的经典老方法; id/1/page/2/opt/1 是新的框架方式。 安德鲁这种技术叫什么名字?谢谢 【参考方案1】:如果你有多个可选参数
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
//...
【讨论】:
【参考方案2】:命名参数通常作为路段完成,但没有明确的命名。因此,例如,您可以这样做:
Route:get('test/id?/page?/opt?', function ($id = null, $page = null, $opt = null)
// do something
);
$id
、$page
和 $opt
在此处都是可选的,由段定义中的 ?
定义,并且它们在函数中具有默认值。但是,您会注意到这里有一些问题:
-
它们必须以正确的顺序出现在 URL 中
只有
$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 框架更适合设置的方式。
【讨论】:
以上是关于Laravel 4:如何传递多个可选参数的主要内容,如果未能解决你的问题,请参考以下文章
ASP.NET MVC 传递多个可选参数 field=value