2013-09-03 3 views
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' => '[email protected]')); 

    /* 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' => '[email protected]')); 

    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('[email protected]', 'city' }} 

ответ

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('/', '[email protected]'); 
Route::resource('blog', 'BlogController', array('only' => array('index', 'show'))); 
Route::get('offers', '[email protected]'); 
Route::get('{city}', '[email protected]'); 
Route::get('{city}/offers', '[email protected]'); 

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 город с помощью пули 'h aarlem ', url с «Амстердам» просто иллюстрирует 404.

  • локальные/Laravel/государственный/-> HomeController :: главный()
  • локальных/Laravel/открытый/блог/-> BlogController :: Индекс()
  • локальных/Laravel/открытый/блог/шоу -> BlogController :: шоу()
  • локальные/Laravel/государственный/предложения -> HomeController :: предложения()
  • локальных/Laravel/открытый/Амстердама -> 404 не найдено исключение
  • локальных/Laravel/public/haarlem -> ДомМатериалы :: город ($ Город)
  • localhost/laravel/public/haarlem/offers -> HomeController :: cityOffers ($ City)
+0

Это решает мою проблему. Спасибо. – Fuhrmann

Смежные вопросы