我正在寻找路由到控制器的GET URL,其参数的数量或它们在URL中的显示顺序可能会有所不同。可能有许多这样的组合,我想为所有这些URL调用相同的控制器操作
我的网址的示例:
- Route :: get('route1 / id / {id}', '控制器1 @ controllerAction1');
- 路线::得到( 'ROUTE1 / ID / {ID} /名称/ {名}', '控制器1 @ controllerAction1');
- 路线::得到( 'ROUTE1 /名称/ {名}', '控制器1 @ controllerAction1');
- 路线::得到( 'ROUTE1 / ID / {ID} /名称/ {名称} /的OrderBy / {的OrderBy}', '控制器1 @ controllerAction1');
- 路线::得到( '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
我想知道是否:
- 做Route :: get('route1 {all}', 'Controller1 @ controllerAction1') - > where('all','。*')是正确的 为get的变量组合调用相同动作的方法 参数?
- Laravel是否提供任何转换功能 “/ id / 1 / name / xyz”到数组('id'=> 1,'name'=>'xyz')或我需要 写自定义功能?
- 有没有更好的方法来实现我的目标? 要求?
答案 0 :(得分:2)
我不相信。另外,通过这种方式,您将无法了解传递的值。
即使有一个,我认为你实际上并不需要传递数组。恕我直言,我更喜欢将这些项目分开,然后从控制器中操纵它们。这只是我的个人建议,但如果您需要一组数据,为什么不使用POST方法呢? (唯一正确的答案是,您希望用户能够保存链接:P)
关于您的请求的复杂部分是,您希望将所有内容保持在相同的控制器操作下,这会使路由混乱。我会尝试这个(在routes.php
中):
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')