我正在开发一个网站,该网站需要一个始终在URL中的城市。像这样:
http://www.examples.com/city/offers
如果用户尝试访问此网址:
http://www.examples.com/offers
我需要将他重定向到页面以选择要查看优惠的城市。如果用户已经选择了一个城市,我会设置一个cookie(或会话)来识别他所选择的城市。
我可以使用路由前缀来做,但我该如何动态做?
我尝试过这种方法:
$city = Request::segment(1);
Route::group(array('prefix' => $city), function()
{
Route::get('/', array('as' => 'home', 'uses' => 'HomeController@index'));
/* Blog Resource */
Route::resource('blog', 'BlogController', array('only' => array('index', 'show')));
});
此代码的问题在于,如果用户访问此页面:
`http://www.example.com/blog`
系统会认为'博客'是当前的城市。
我尝试过的另一种方法(代码有点脏):
$city = Request::segment(1);
if ($city == null)
{
$city = Session::get('cidade');
}
if ($city != null)
{
$city = City::where('slug', '=', $city)->first();
}
if (sizeof($city) > 0)
{
Session::put('city', $city['slug']);
$requestedPath = Request::path();
if (!str_contains($requestedPath, $city['slug']))
{
return Redirect::to('/' . $city['slug'] . $requestedPath)->sendHeaders();
}
}
else
{
Redirect::to('/choose')->sendHeaders();
exit();
}
Route::group(array('prefix' => $city), function()
{
Route::get('/', array('as' => 'home', 'uses' => 'HomeController@index'));
Route::resource('blog', 'BlogController', array('only' => array('index', 'show')));
});
上面代码的问题是循环。如果用户访问了网页http://www.example.com/offers
,系统会识别offers
它不是城市,并将用户重定向到http://www.example.com/choose
,以便用户可以选择该城市。但是,当重定向到choose
时,系统会再次识别choose
它不是城市并继续重定向......
我知道我可以选择使用子域名,但在这种情况下我无法使用,因为客户端需要这种方式。
我已经尝试过这个软件包(https://github.com/jasonlewis/enhanced-router),但它确实解决了我的问题50%。另一个问题是它总是迫使我在创建URL时放置一个城市:
{{ URL::action('HomeController@index', 'city' }}
答案 0 :(得分:2)
阅读完帖子后,我决定重新创建这种情况,并引入一些自定义路由绑定。 路线被视为首先注册,首次投放',因此您可以像这样控制:
routes.php文件
<?php
Route::bind('city', function($value, $route) {
if($City = City::whereSlug($value)->first()) // find record on column 'slug'
{
return $City;
}
App::abort(404);
});
Route::get('/', 'HomeController@main');
Route::resource('blog', 'BlogController', array('only' => array('index', 'show')));
Route::get('offers', 'HomeController@offers');
Route::get('{city}', 'HomeController@city');
Route::get('{city}/offers', 'HomeController@cityOffers');
HomeController.php
<?php
class HomeController extends BaseController {
public function main()
{
return __METHOD__;
}
public function offers()
{
return __METHOD__;
}
public function city(City $City)
{
return __METHOD__;
}
public function cityOffers(City $City)
{
return __METHOD__;
}
}
BlogController.php
<?php
class BlogController extends BaseController {
public function index()
{
return __METHOD__;
}
public function show()
{
return __METHOD__;
}
}
假设您的数据库中有1个城市有slug&#39; haarlem&#39;,网址是&#39;阿姆斯特丹&#39;只是为了说明404。