我想在搜索时生成像这样的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路由文件:
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} (甚至使用最后的路由规则):
public function index($region='', $city='', $page='')Codeigniter参数是按名称映射的,但它看起来是Laravel按位置映射的,所以我总是在$region中得到第一个参数。
是否可以用名称而不是位置来路由参数,或者使用Laravel将它们输入控制器?(我可以数段,但对我来说这是一个丑陋的解决方案)。
发布于 2015-05-30 18:36:33
您可以使用Route::current()方法访问当前路由,并通过parameter method按名称获取参数。但是,您的路由定义存在问题,这将使定义的最后两条路由毫无用处。
因为最后两条路由中的page参数是可选的,因此取决于第二和第三条路由将不匹配的路由路径,这是因为路由的定义不明确。下面的测试用例证明了我的观点。
如果您的控制器中有这样的内容:
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
{
"region": "myregion",
"city": "mycity",
"page": "mypage"
}2. For example.com/search/myregion/mypage
{
"region": "myregion",
"city": "mypage",
"page": null
}3. For example.com/search/mypage
{
"region": "mypage",
"city": null,
"page": null
}因此,这里的问题不是按顺序或名称进行参数匹配,而是通过路由定义。要解决这个问题,您只需在查询字符串中使用分页,并将其完全删除路由定义,因为如果您的分页是可选的,那么将其作为查询字符串参数绝对没有任何问题。所以您的URL应该如下所示:
example.com/search/myregion/mycity?page=2您可以检查照明路由类API,以查看那里有哪些其他方法可用。
https://stackoverflow.com/questions/30549416
复制相似问题