Laravel 4 参数顺序可变的Laravel路由url

Laravel 4 参数顺序可变的Laravel路由url,laravel-4,Laravel 4,我正在研究如何为GET URL路由到一个控制器,该控制器的参数可以在数量上或在URL中出现的顺序上有所不同。可能有许多这样的组合,我想为所有这些URL调用相同的控制器操作 我的URL的外观示例如下: 路由::get('route1/id/{id}', 'Controller1@controllerAction1'); 路由::get('route1/id/{id}/name/{name}', 'Controller1@controllerAction1'); 路由::get('route1/na

我正在研究如何为GET URL路由到一个控制器,该控制器的参数可以在数量上或在URL中出现的顺序上有所不同。可能有许多这样的组合,我想为所有这些URL调用相同的控制器操作

我的URL的外观示例如下:

  • 路由::get('route1/id/{id}', 'Controller1@controllerAction1');
  • 路由::get('route1/id/{id}/name/{name}', 'Controller1@controllerAction1');
  • 路由::get('route1/name/{name}', 'Controller1@controllerAction1');
  • 路由::get('route1/id/{id}/name/{name}/orderby/{orderby}', 'Controller1@controllerAction1');
  • 路由::get('route1/id/{id}/orderby/{orderby}', 'Controller1@controllerAction1'); 同样在控制器操作中,我最终希望将这个查询字符串分解为一个数组。对于上面提到的第二个示例,我希望将查询字符串
    id/{id}/name/{name}
    转换为数组
    ('id'=>{id},'name'=>{name})

    要为URL的所有不同变体调用相同的控制器操作,我在routes.php中有以下代码:

    Route::get('route1{all}', 'Controller1@controllerAction1')->where('all', '.*')
    
    对于上述不同类型的URL,它似乎调用了
    Controller1
    的“
    controllerAction1

    在函数
    controllerAction1
    中,我正在执行

    $route_input = Route::input('all'); 
    var_dump($route_input);
    which prints "/id/1/name/xyz" when I hit http://example.com/laravel/public/route1/id/1/name/xyz
    
    我想知道:

  • 正在执行路由::get('route1{all}', 'Controller1@controllerAction1')->其中('all','.*)是右边的 方法为get的变量组合调用相同的操作 参数?
  • Laravel是否提供任何转换功能 “/id/1/name/xyz”到数组('id'=>1,'name'=>'xyz'),或者我需要 编写自定义函数?
  • 有没有更好的方法来实现我的 要求?
  • 我相信没有。另外,通过这种方式,您将无法理解正在传递哪些值

  • 即使有一个,我想你实际上也不需要通过数组。嗯,我更喜欢将项目分开,然后从控制器中操纵它们。这只是我个人的建议,但如果您需要一系列数据,为什么不使用POST方法呢?(唯一正确的答案是,您希望用户能够保存链接:P)

  • 请求的复杂部分是,您希望将所有内容都保持在相同的控制器操作下,这会扰乱路由。我想试试这个(在你的
    routes.php
    ):

  • 路由::模式('id','[0-9]+'); 路由::模式('name','[a-Z]+'); 路由::get('route1/{id}/{name?}/{orderby?}','Controller1@controllerAction1'); 路由::get('route1/{name}/{orderby?}','Controller1@controllerAction1'); 这样:

    • 您可以有一个只包含ID的路由,其中NAME和ORDERBY是可选的

    • 如果没有传递ID,您可以拥有一个只有名称的路由,其中ORDERBY是可选的


    请注意这与您的URL有多大的不同:在编写路由时放置路由比我建议的方式要复杂得多。
    id/{id}/name/{name}
    。如果您完全按照自己的方式需要它们,为什么不调用从GET函数传递变量的链接,如下所示

    要将路由参数从一组单独的参数转换为包含Laravel 5中所有参数的数组,可以从控制器调用:

    $routeParameters=$this->getRouter()->getCurrentRoute()->parameters()

    用于路由定义
    Route::get('route1/id/{id}/name/{name}','Controller1@controllerAction1');
    如果用户点击以下路径:
    /route1/id/2/name/john

    $routeParameters
    将等于
    array(id=>2,name=>john')

    感谢您的回复。我喜欢你的建议。我会尝试格式化。@user3402821不客气:)您能接受答案吗?否则其他人将浪费时间回答我将遵循yoursite.com/route1?id=xxxx&name=yyyy&orderBy=zzzz格式。谢谢你的回答 Route::pattern('id', '[0-9]+'); Route::pattern('name', '[a-Z]+'); Route::get('route1/{id}/{name?}/{orderby?}', 'Controller1@controllerAction1'); Route::get('route1/{name}/{orderby?}', 'Controller1@controllerAction1');