0

URL に常に都市が必要な Web サイトを開発しています。このようなもの:

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

ユーザーがこの URL にアクセスしようとした場合:

http://www.examples.com/offers

オファーを表示する都市を選択するページに彼をリダイレクトする必要があります。ユーザーがすでに都市を選択している場合、選択した都市を識別するために Cookie (またはセッション) を設定します。

Route プレフィックスを使用してそれを行うことはできますが、動的に行うにはどうすればよいですか?

私はこのアプローチを試しました:

$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% 解決しました。もう 1 つの問題は、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');

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__;
    }
}

ブログコントローラー.php

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

    public function show()
    {
        return __METHOD__;
    }
}

DB にスラッグ「haarlem」を持つ都市が 1 つあると仮定しましょう。「アムステルダム」の URL は 404 を説明するためのものです。

  • localhost/laravel/public/ -> HomeController::main()
  • localhost/laravel/public/blog/ -> ブログコントローラー::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 に答える