首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Laravel 5-控制器中的路由和可变参数

Laravel 5-控制器中的路由和可变参数
EN

Stack Overflow用户
提问于 2015-05-30 17:49:51
回答 1查看 6.1K关注 0票数 3

我想在搜索时生成像这样的SEO友好URL:

http://www.example.com/search (无滤波器)

www.example.com/search/region-filter

www.example.com/search/region-filter/city-filter

用这样的方式将它们分页:

http://www.example.com/search/2 (无过滤器,第2页)

www.example.com/search/region-filter/2

www.example.com/search/region-filter/city-filter/2

(对不起,由于名誉原因,我不能发布超过2个链接)

因此,,第二个段可以是一个过滤器或多个页面(与第三个页面相同)。

我的Laravel 5路由文件:

代码语言:javascript
运行
复制
Route::pattern('page', '[0-9]+');
...
Route::get('search/{region}/{city}/{page?}', 'SearchController@index');
Route::get('search/{region}/{page?}', 'SearchController@index');
Route::get('search/{page?}', 'SearchController@index');

由于“页面”模式,路由工作得很好,但是在控制器内部,这个请愿www.example.com/search/2映射$region中的{page} (甚至使用最后的路由规则):

代码语言:javascript
运行
复制
public function index($region='', $city='', $page='')

Codeigniter参数是按名称映射的,但它看起来是Laravel按位置映射的,所以我总是在$region中得到第一个参数。

是否可以用名称而不是位置来路由参数,或者使用Laravel将它们输入控制器?(我可以数段,但对我来说这是一个丑陋的解决方案)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-30 18:36:33

您可以使用Route::current()方法访问当前路由,并通过parameter method按名称获取参数。但是,您的路由定义存在问题,这将使定义的最后两条路由毫无用处。

因为最后两条路由中的page参数是可选的,因此取决于第二和第三条路由将不匹配的路由路径,这是因为路由的定义不明确。下面的测试用例证明了我的观点。

如果您的控制器中有这样的内容:

代码语言:javascript
运行
复制
public function index()
{
    $route = \Route::current();

    $region = $route->parameter('region');
    $city = $route->parameter('city');
    $page = $route->parameter('page');

    $params = [
        'region' => $region,
        'city' => $city,
        'page' => $page
    ];

    return $params;
}

对于每条路线,您将得到以下结果:

1. For example.com/search/myregion/mycity/mypage

代码语言:javascript
运行
复制
{
    "region": "myregion",
    "city": "mycity",
    "page": "mypage"
}

2. For example.com/search/myregion/mypage

代码语言:javascript
运行
复制
{
    "region": "myregion",
    "city": "mypage",
    "page": null
}

3. For example.com/search/mypage

代码语言:javascript
运行
复制
{
    "region": "mypage",
    "city": null,
    "page": null
}

因此,这里的问题不是按顺序或名称进行参数匹配,而是通过路由定义。要解决这个问题,您只需在查询字符串中使用分页,并将其完全删除路由定义,因为如果您的分页是可选的,那么将其作为查询字符串参数绝对没有任何问题。所以您的URL应该如下所示:

代码语言:javascript
运行
复制
example.com/search/myregion/mycity?page=2

您可以检查照明路由类API,以查看那里有哪些其他方法可用。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30549416

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档