Laravel路由url具有可变的参数顺序

时间:2014-03-10 17:45:50

标签: laravel-4

我正在寻找路由到控制器的GET URL,其参数的数量或它们在URL中的显示顺序可能会有所不同。可能有许多这样的组合,我想为所有这些URL调用相同的控制器操作

我的网址的示例:

  
  1. Route :: get('route1 / id / {id}',   '控制器1 @ controllerAction1');
  2.   
  3. 路线::得到( 'ROUTE1 / ID / {ID} /名称/ {名}',   '控制器1 @ controllerAction1');
  4.   
  5. 路线::得到( 'ROUTE1 /名称/ {名}',   '控制器1 @ controllerAction1');
  6.   
  7. 路线::得到( 'ROUTE1 / ID / {ID} /名称/ {名称} /的OrderBy / {的OrderBy}',   '控制器1 @ controllerAction1');
  8.   
  9. 路线::得到( 'ROUTE1 / ID / {ID} /的OrderBy / {的OrderBy}',   'Controller1 @ controllerAction1');

同样在Controller动作中,我最终想要将此查询字符串分解为数组。对于上面提到的第二个示例,我希望将查询字符串id/{id}/name/{name}转换为数组('id' => {id}, 'name' => {name})

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

Route::get('route1{all}', 'Controller1@controllerAction1')->where('all', '.*')

似乎为controllerAction1针对上述不同类型的网址调用了“Controller1”。

在函数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

我想知道是否:

  
  1. 做Route :: get('route1 {all}',   'Controller1 @ controllerAction1') - > where('all','。*')是正确的   为get的变量组合调用相同动作的方法   参数?
  2. Laravel是否提供任何转换功能   “/ id / 1 / name / xyz”到数组('id'=> 1,'name'=>'xyz')或我需要   写自定义功能?
  3. 有没有更好的方法来实现我的目标?   要求?

2 个答案:

答案 0 :(得分:2)

  1. 我不相信。另外,通过这种方式,您将无法了解传递的值。

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

  3. 关于您的请求的复杂部分是,您希望将所有内容保持在相同的控制器操作下,这会使路由混乱。我会尝试这个(在routes.php中):

  4.     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');
    

    这样:

    • 您可以拥有一个只有ID的路线,其中NAME和ORDERBY是可选的

    • 如果没有传递ID,您可以拥有一条只有NAME的路线,其中ORDERBY是可选的

    请注意这与您的网址有何不同:将路线编写为id/{id}/name/{name}时要比我提出{id}/{name}的方式复杂得多。如果您完全按照自己的方式使用它们,为什么不调用从GET函数传递变量的链接,如下所示? http://www.yoursite.com/route1?id=xxxx&name=yyyy&orderBy=zzzz

答案 1 :(得分:1)

要让路由参数从一组单独的参数转换为包含Laravel 5中所有参数的数组,您可以从Controller中调用它:

$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')