如何构建需要特定 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',那么这些是作为第三个和第四个参数传递给过滤器函数的吗?快到了!! 单词datarefresh 根本不应该出现在过滤器中,这个过滤器应该只接受第一个和第二个参数然后执行检查。参数datarefresh 应该输入到代码的路由行中......请在你的回答中为我澄清,我可以接受。非常感谢您的帮助! 您可以使用ajax:data=value 传递它,然后使用explode('=', $param) 分解它,您将得到一个数组,0data1value【参考方案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?

强制在 ASP.NET Core 中具有查询参数的所有 Url

使用 XPath 从参数映射构建 URL 查询字符串

如何使用jquery查询url参数? [复制]