2014-10-18 1 views
0

저는 Laravel에서 만든 기본적인 블로그 구조를 가지고 있습니다. 때문에 등 게시물, 설문 조사, 위해, DRY 컨트롤러 공공 및 관리 공유 물건을 유지하는 내가 행한 일을 유지하기 위해, 이제 (나는 그것이 필터 같아요?)경로 그룹의 '전용'경로 필터 사용

/* 
    The public can access only index and show ::resource routes 
     - domain.tld/posts 
     - domain.tld/posts/{id} 
     - domain.tld/polls 
     - domain.tld/polls/{id} 
     - domain.tld/categories 
     - domain.tld/categories/{id} 
     - domain.tld/tags 
     - domain.tld/tags/{id} 

*/ 
Route::resource('posts', 'PortalPostsController', ['only' => ['index', 'show']]); 
Route::resource('polls', 'PortalPollsController', ['only' => ['index', 'show']]); 
Route::resource('categories', 'PortalCategoriesController', ['only' => ['index', 'show']]); 
Route::resource('tags', 'PortalTagsController', ['only' => ['index', 'show']]); 

/* 
    Administration uses the same PortalSomethingController but can access 
    all routes by prefixing administration/ to the URL: 

     - domain.tld/administration/posts 
     - domain.tld/administration/posts/create 
     ... all of other administration/resource('posts') routes 

     ... all administration/resource('polls') routes 
     ... all administration/resource('categories') routes 
     ... all administration/resource('tags') routes 
*/ 
Route::group(['prefix' => 'administration'], function() { 
    Route::resource('posts', 'PortalPostsController'); 
    Route::resource('polls', 'PortalPollsController'); 
    Route::resource('categories', 'PortalCategoriesController'); 
    Route::resource('tags', 'PortalTagsController'); 
}); 

only 필터를 사용하여 라우팅하여 건조한 상태에서 공용 액세스를 제한하기 위해 모든 단일 Route :: 리소스에 [ 'only'=> [ 'index', 'show']를 정의하는 것을 피하고 싶습니다. 그래서, 다음과 같은 것 :

// for public access 
Route::group(['only' => ['index', 'show']], function() { 
    Route::resource('posts', 'PortalPostsController'); 
    Route::resource('polls', 'PortallPollsController'); 
    Route::resource('categories', 'PortallCategoriesController'); 
    Route::resource('tags', 'PortallTagsController'); 
}); 

// for admin access 
Route::group(['prefix' => 'administration'], function() { 
    Route::resource('posts', 'PortalPostController'); 
    Route::resource('polls', 'PortallPollsController'); 
    Route::resource('categories', 'PortallCategoriesController'); 
    Route::resource('tags', 'PortallTagsController'); 
}); 

가능하면 어떻게할까요? 또한 공개 및 관리 루트 그룹 모두 동일한 리소스 (일부 경로에만 공개)와 동일한 컨트롤러를 사용하므로 DRY를 더 많이 할 수 있습니까? 예 :

// define shared resources 
Route::group(['name' => 'sharedResources'], function() { 
    Route::resource('posts', 'PortalPostController'); 
    Route::resource('polls', 'PortallPollsController'); 
    Route::resource('categories', 'PortallCategoriesController'); 
    Route::resource('tags', 'PortallTagsController'); 
}); 

// public access 
Route::group(['only' => ['index', 'show']], function() { 
    // use sharedResources 
}); 

// admin access 
Route::group(['prefix' => 'administration'], function() { 
    // use sharedResources 
}); 

미리 감사드립니다.

답변

0

경로의 첫 번째 URI 구성 요소로 와일드 카드를 사용할 수 있으며 컨트롤러에 해당 와일드 카드를 사용할 수 있습니다. 유일한 문제는 와일드 카드가 URI의 첫 번째 세그먼트 인 경우 선택적 요소가 될 수 없다는 것입니다. 그래서 당신은뿐만 아니라 관리자가 아닌 경로에 대한 몇 가지 접두사를 포함해야합니다 :

domain.tld/user/posts 
domain.tld/admin/posts 

당신이, 당신은이 같은 라우팅을 설정할 수 있습니다 그렇게 할 경우 컨트롤러에서

Route::pattern('admin', 'admin|user'); 
Route::resource('{admin?}/posts', 'PortalPostController'); 
Route::resource('{admin?}/polls', 'PortalPollsController'); 
... 

을, 당신 $ admin 접두사를 읽고 접두사가 'user'인 경우 'index'/ 'show'제한을 __construct 메서드의 beforeFilter 메서드로 적용 할 수 있습니다. (DRY 일을 유지하기 위해, 당신은 BaseController이 필터 논리를 넣어, 당신의 PortalControllers이 BaseController를 확장하고 parent::__construct를 호출 할 수 있습니다.


또 다른 옵션, 더 나은 하나를 당신이 제어 할 경우 서버의 구성을 통해 도메인 라우팅을 사용하면 일반 사용자는 domain.tld/posts 또는 www.domain.tld/posts을 사용하여 사이트에 액세스하고 관리자는 admin.domain.tld/posts을 사용합니다. 호스트 이름의 첫 번째 부분을 캡처 한 다음 only 필터를 Contoller에서 beforeFilter로 처리 할 수 ​​있습니다 (위와 같음) 이에 대한 좋은 설명은 Daylight Rees의 코드 밝기 (도메인 라우팅 참조) 섹션을 참조하십시오. http://daylerees.com/codebright/advanced-routing .