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:如何传递多个可选参数的主要内容,如果未能解决你的问题,请参考以下文章

带有可选参数和 ajax 调用的 Laravel 路由

ASP.NET MVC 传递多个可选参数 field=value

将多个参数从控制器传递到工厂服务进行 REST 调用并返回(可选)数据

具有多个可选参数的控制台输出

将可选参数优化传递到查询中

Laravel 8:如何使隐式模型绑定路由参数可选而不是抛出 404?