我希望为电子商务商店铺平我的路线以进行搜索引擎优化。
我想创建以下路线:
Route::get('/{country}', ['uses' => 'Store\ProductController@browseCountry']);
Route::get('/{category}, ['uses' => 'Store\ProductController@browseCategory']')
country
和category
必须是动态的。
我想知道以下内容是否可行?以及实现的最佳方式。
// Route 1
Route::get('/{country}', ['uses' => 'Store\ProductController@browseCountry'])
->where('country', ProductCountry::select('slug')->get());
// Route 2
Route::get('/{category}', ['uses' => 'Store\ProductController@browseCategory'])
->where('category', ProductCategory::select('slug')->get());
示例路线:
/great-britain should be routed via Route 1
/china should be routed via Route 1
/widgets should fail route 1, but be routed via Route 2 because
widgets are not in the product_country table but are in
the product_category table
我知道我可以在可能的国家/地区对我的路线进行硬编码:
Route::get('/{country}', ['uses' => 'Store\ProductController@browse'])
->where('country', 'great-britain|china|japan|south-africa');
然而,这是笨拙和愚蠢的。我想从数据库中获取国家列表。
答案 0 :(得分:1)
我将这样做,我选择国家模型,因为有更少的模型+你需要缓存: 将列表('名称')更改为国家/地区名称列
Route::get('/{country}', ['uses' => 'Store\ProductController@browseCountry'])
->where('country', implode('|',ProductCountry::select('slug')->lists('name')));
选择所有国家/地区名称并将其作为数组返回
('usa','england','thailand')
并使用'|'进行内爆当胶水返回时:
usa|england|thailand
所以你的最终路线是这样的:
Route::get('/{country}', ['uses' => 'Store\ProductController@browseCountry'])
->where('country', 'usa|england|thailand');
答案 1 :(得分:0)
好的,所以在查看更新后的问题后,您需要在各自的模型中创建一个方法,以便将所有可用的slug连接到|性格,所以你会打电话给:
Route::get('/{country}', ['uses' => 'Store\ProductController@browseCountry'])
->where('country', ProductCountry::getSlugs());
在你的例子中,这几乎会回归“大英国|中国|日本|南非”,除非你不必写它。
但是,我强烈建议你给路线更多一点,/ country / {country}或/ category / {category}否则会让人感到困惑,而URI结构通常都是这样的,这样用户就可以准确看看他们在哪里。答案 2 :(得分:0)
您需要路由过滤器来实现这一目标。
将以下代码放入filters.php
或route.php
文件
Route::filter('country', function()
{
$country = Country::where('slug', Route::input('country'))->first();
if( ! $country) {
dd("We do not support this country");
// Redirect::route('home');
}
});
最后你的路线:
Route::get('country/{country}', array('before' => 'country', 'uses' => 'Store\ProductController@browseCountry'));