0

我正在开发一个需要在 URL 中始终使用城市的网站。像这样的东西:

http://www.examples.com/city/offers

如果用户尝试访问此 URL:

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' }}
4

1 回答 1

2

阅读您的帖子后,我决定重新创建这种情况,并引入一些自定义路由绑定。路线被读作“先注册,先服务”,因此您可以像这样保持控制:

路由.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');

家庭控制器.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__;
    }
}

博客控制器.php

<?php
class BlogController extends BaseController {
    public function index()
    {
        return __METHOD__;
    }

    public function show()
    {
        return __METHOD__;
    }
}

假设您的数据库中有 1 个带有 slug 'haarlem' 的城市,带有 'amsterdam' 的 url 只是为了说明 404。

  • localhost/laravel/public/ -> HomeController::main()
  • localhost/laravel/public/blog/ -> BlogController::index()
  • localhost/laravel/public/blog/show -> BlogController::show()
  • localhost/laravel/public/offers -> HomeController::offers()
  • localhost/laravel/public/amsterdam -> 404 未找到异常
  • localhost/laravel/public/haarlem -> HomeController::city($City)
  • localhost/laravel/public/haarlem/offers -> HomeController::cityOffers($City)
于 2013-09-04T08:32:19.350 回答