【发布时间】:2015-08-13 11:47:09
【问题描述】:
我想在搜索时生成这样的 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} 映射到 $region(即使使用最后的路由规则):
public function index($region='', $city='', $page='')
Codeigniter 参数是按名称映射的,但看起来 Laravel 是按位置映射它们的,所以我总是在 $region 中获取第一个。
是否可以通过名称而不是位置来路由参数,或者使用一些 Laravel 替代方法将它们放入控制器中?(我可以计算段数,但这对我来说是一个丑陋的解决方案) p>
【问题讨论】:
-
你为什么不做类似这样的公共函数 index($region = NULL, $city = NULL, $page = NULL) 那么,在你的方法中,如果只有 search/{page} 检查如果 $page 是一个整数,如果不是,那么它就是你的区域。但是 $region 将是您的 $page ...我建议您将方法分开用于一个路由。容易多了。
-
我想过像你说的那样(检查它是否是整数),但我希望 Laravel 有一些机制可以让它更干净。您的意思是另一种选择是创建三个方法,其中一个索引,另外两个“指向”索引并以正确的顺序传递参数?我在 CI 中使用 remap 功能做了类似的事情,但我再次希望 Laravel 会有更好的东西。
-
我将为您的 3 个路由创建 3 种不同的方法。这样,您可以 100% 确定您将确切知道可以在您的方法中使用什么样的参数。
-
好的,谢谢。如果没有其他选择,我想我会这样做。我是 Laravel 的新手,我并不完全了解该框架有什么以及什么是好的做法。
-
最好的方法是查看他们的文档。有大量的服务,您可以提供帮助的帮手。很抱歉无法在这方面为您提供进一步的帮助。祝 Laravel 好运!
标签: php laravel laravel-5 laravel-routing