2013-09-03 6 views
0

URL에 항상 도시가 필요한 웹 사이트를 개발 중입니다. 이런 식으로 뭔가 : 제가 제안을 볼 수있는 도시를 선택하는 페이지로 그를 리디렉션 할 필요가동적 경로 접두사를 정의하십시오.

http://www.examples.com/offers

:

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

사용자가이 URL에 액세스하려고합니다. 사용자가 이미 도시를 선택하면 쿠키 또는 세션을 설정하여 선택한 도시를 식별합니다.

경로 접두사를 사용하여 수행 할 수 있지만 어떻게 동적으로 수행합니까?

`http://www.example.com/blog` 
이 시스템은 '블로그'라고 생각합니다

현재는 다음과 같습니다

이 코드의 문제는 사용자 액세스 페이지 경우 것으로
$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'))); 
}); 

입니다 :

나는이 방법을 시도했습니다 시티.

내가 해봤 또 다른 방법은 (코드는 더러운 조금) : 위의 코드와

$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

을, 나는 상황을 재 작성하고 일부 사용자 지정에 경로 결합을 가지고하기로 결정했다. 경로는 '최초 등록, 최초의 봉사'로 읽기, 그래서 당신은 이런 식으로 주도권을 유지 할 수 있습니다

<?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

routes.php

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

    public function show() 
    { 
     return __METHOD__; 
    } 
} 

DB에 슬러그가있는 도시가 1 개 있다고 가정 해 봅시다. aarlem ','암스테르담 '이있는 URL은 404를 설명하기위한 것입니다.

  • 로컬 호스트/laravel/공공/-> HomeController : 주()
  • 로컬 호스트/laravel/공공/블로그/-> BlogController :: 지수()
  • 로컬 호스트/laravel/공공/블로그/쇼 -> BlogController :: 쇼()
  • 로컬 호스트/laravel/공공/제공 -> HomeController :: 이벤트()
  • 로컬 호스트/laravel/공공/암스테르담 -> 404 찾을 수 없음 예외
  • 로컬 호스트/laravel/public/haarlem -> HomeController :: 도시 ($ 도시)
  • localhost/laravel/public/haarlem/offers -> HomeController :: cityOffers ($ City)
+0

내 문제가 해결되었습니다. 고맙습니다. – Fuhrmann