php – Laravel 5 – 控制器中的路由和变量参数

我想在搜索生成这样的SEO友好URL:
http://www.example.com/search(无过滤器)
HTTP://**www.example.com/search/region-filter
HTTP://**www.example.com/search/region-filter/city-filter

并以这种方式对它们进行分页
http://www.example.com/search/2(无过滤器,第2页)
HTTP://**www.example.com/search/region-filter/2
HTTP://**www.example.com/search/region-filter/city-filter/2

(抱歉,由于声誉我不能发布2个以上的链接)

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

我的Laravel 5路由文件

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

由于“页面”模式,路由工作正常,但在控制器内部这个请求http://**www.example.com/search/2映射$page中的{page}(即使使用最后的路由规则):

public function index($region='', $city='', $page='')

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

是否可以通过名称而不是位置来路由参数,或者使用一些Laravel替代方法将它们放入控制器中? (我可以计算细分,但这对我来说是一个难看的解决方案)

解决方法:

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

因为最后两个路由中的页面参数是可选的,因为路由路径将使您的第二个和第三个路由无法正确匹配,因为路由的定义不明确.下面是测试用例,证明了我的观点.

如果你在控制器中有这个:

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.例如:/search/myregion/mycity/mypage:

{
    "region": "myregion",
    "city": "mycity",
    "page": "mypage"
}

2.例如http://search/myregion/mypage:

{
    "region": "myregion",
    "city": "mypage",
    "page": null
}

3.例如:/search/mypage:

{
    "region": "mypage",
    "city": null,
    "page": null
}

所以你的问题不在于按顺序或按名称进行参数匹配,而是与路径定义有关.要解决这个问题,您可以在查询字符串中添加分页并将其完全删除路由定义,因为如果它是可选的,那么将您的分页作为查询字符串参数绝对没有错.所以你的URL看起来像这样:

example.com/search/myregion/mycity?page=2

您可以查看Illuminate\Routing\Route类API,了解您可以使用的其他方法.

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...