如何构建需要特定 URL 查询参数的 Laravel 路由?
Posted
技术标签:
【中文标题】如何构建需要特定 URL 查询参数的 Laravel 路由?【英文标题】:How to build a Laravel route that requires a specific URL query parameter? 【发布时间】:2014-04-18 22:04:46 【问题描述】:假设我有这样的网址:
-
localhost/admin/users/
localhost/admin/users/?data=refresh
还有一个像这样的简单控制器:
class UsersController extends Controller
public function index()
// call some services
// return a view
public function dataRefresh
// call some services
// return some JSON
这是我正在处理的 routes.php:
Route::get('admin/users', array('as' => 'admin.users', 'uses' => 'Admin\Users\UsersController@index'));
Route::get('admin/users????' , array('before' => 'ajax', 'as' => 'admin.users', 'uses' => 'Admin\Users\UsersController@dataRefresh'));
我可以在我的第二条路由中做些什么来要求 URL 查询参数 ?data
并且还需要将其设置为 data=refresh
? strong> 并且如何确保它不会与其他路由冲突?
注意: 我知道这可能不会被某些人认为是“漂亮的 URL”。我确实在适当的时候实现了漂亮的 URL / slug,但是我也认为在很多情况下查询参数更加清晰和清晰(即让用户清楚地了解页面 URL 的哪一部分用于过滤datagrid ...并向用户保证可以删除参数而不会导致页面中断或丢失)。 Google 自己以及许多其他知名网站都这样做。
注意:我已将 ajax 路由过滤器应用于第二个路由。我还将路由设置为指向控制器中的 dataRefresh 方法。
这是我所知道的。有什么想法吗?
【问题讨论】:
【参考方案1】:Laravel 不使用 uri
的查询部分进行路由,对于 localhost/admin/users?data=refresh
,您可以使用如下内容:
Route::get('admin/users', function()
$data = Input::get('data');
);
您可以使用localhost/admin/users?data=refresh
向路由发出请求。你可以像这样声明你的route
:
Route::get('admin/users' , array('before' => 'ajax:data', 'as' => 'admin.users', 'uses' => 'Admin\Users\UsersController@dataRefresh'));
这里,refresh
被传递给路由过滤器,并且在第三个参数 ($param
) 中可用,因此您可以在 $param
中检索 refresh
。如下所示创建过滤器:
Route::filter('ajax', function($route, $request, $param)
// This will give query string 'refresh'
// if you passed it as http://domain.com?data=refresh
$data = $request->get($param);
// You can retrieve the $param, third argument
// if you pass a parameter, i.e. 'refresh'
// param will contain 'refresh'
);
【讨论】:
我是否在路由内部执行检查并调用适当的控制器@方法?如果输入存在并且是 ajax 请求,则调用 UsersController@dataRefresh ???我需要将我所有的 ajax 请求/参数检查都放在这里以供管理员/用户页面使用,对吗? 您可以在过滤器中查看。 是的,好的,是的...检查过滤器中的参数。最后一个细节......如果我也想传递值怎么办?像这样'before' => 'ajax:data:refresh'
,那么这些是作为第三个和第四个参数传递给过滤器函数的吗?快到了!!
单词data
或refresh
根本不应该出现在过滤器中,这个过滤器应该只接受第一个和第二个参数然后执行检查。参数data
和refresh
应该输入到代码的路由行中......请在你的回答中为我澄清,我可以接受。非常感谢您的帮助!
您可以使用ajax:data=value
传递它,然后使用explode('=', $param)
分解它,您将得到一个数组,0
是data
,1
是value
。【参考方案2】:
我认为你最接近你想要的是Route::input
。
http://laravel.com/docs/routing#route-parameters
访问路由参数值
如果您需要访问路由之外的路由参数值,您可以 可以使用
Route::input
方法:
Route::filter('foo', function()
if (Route::input('id') == 1)
//
);
我个人不会这样做,我只会检查控制器中的参数,如果匹配,则执行刷新或改用admin/users/refresh
路由。
【讨论】:
我可以制作一个适用于任何参数的过滤器吗?换句话说,我可以将参数名称传递给过滤器,然后过滤器采用该名称并检查它是否在 Route::input 中? IE。'before' => 'myfilter:data'
???以及如何传递值的第二个参数?【参考方案3】:
Route::get('admin/users/data?' , array('before' => 'ajax', 'as' => 'admin.users', 'uses' => 'Admin\Users\UsersController@数据刷新'));
你可以
/admin/users/刷新
【讨论】:
这会查找段,而不是查询参数以上是关于如何构建需要特定 URL 查询参数的 Laravel 路由?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Swift 中使用包含多个值的查询参数构建 URL?
如何使用包含Swift中相同键的多个值的查询参数构建URL?
如何在 javascript 中解析特定查询参数的 URL?