2014-07-16 2 views
1

질문 제목은 내가 생각할 수있는 가장 명확한이지만, 여기에 명확성을 위하여 사용 사례/예제 :컨트롤러 경로의 매개 변수를 재정렬하거나 무시할 수 있습니까?

Route::get('article/{slug}/{id}', '[email protected]'); 

... 

class ArticleController extends BaseController { 

    public function show($id) 
    { 
     return View::make('article')->with('article', Article::find($id)); 
    } 

} 

이 원 '

내가 기사를 보여주기 위해 다음과 같은 경로를 정의하는 말 show과 같이 $id 매개 변수를 $slug 매개 변수로 잘못 해석하게됩니다. show 메서드에 $id 매개 변수 만 전달하는 방법이 있습니까?

+0

'article/{id} ''로의 경로를 변경할 수 있습니까? –

+0

네,하지만'/ article/12345'보다 기억하기 쉬운'/ article/some-title/12345'와 같이 사용자가 입력하는 추가 이점을 잃을 것입니다 (예를 들어, at StackOverflow의 URL). – Lazlo

+0

그러면 show 함수를'public function show ($ slug, $ id)'로 바꾸지 않으시겠습니까? 컨트롤러에 슬러그로 기사를 가져올 수 있습니까? 당신의 옵션은 여기에서 꽤 제한되어 있습니다, 당신은 경로에서 슬러그를 원하거나 그렇지 않습니다. –

답변

2

은 수동 컨트롤러 함수를 호출하는 것이 가능 :에

당신의 ArticleController이이 Laravel 컨트롤러 클래스의 방법의 callAction($method, $parameters) 방법 과부하, 그래서 다음과 같습니다

public function callAction($method, $parameters) 
{ 
     unset($parameters['id']); 
     unset($parameters['slug']); 

     return parent::callAction($method, $parameters); 
} 

다음에 이것을 쉽게 수행 할 수 있습니다 :

public function show($id) 
{ 
    return View::make('article')->with('article', Article::find($id)); 
} 
2

당신은 확실히 "무시"할 수 Laravel와 매개 변수 - 즉 것은 그들을 선택하기 - 자신의 이름 뒤에 물음표를 추가하여 :

Route::get('article/{slug?}/{id?}', '[email protected]'); 

참고가 선택적 함수 인수를 처리 PHPs 방법에 의해 제한된다 : 오른쪽에 필요한 인수가있는 경우 가장 왼쪽의 인수는 선택 사항이 될 수 없습니다.

// Do 
Route::get('article/{id}/{slug?}', '[email protected]'); 
... 
function show($id, $slug = null) {} 

// Don't 
Route::get('article/{slug?}/{id}', '[email protected]'); 
... 
function show($slug = null, $id) {} 

위의 의견에 동의한다는 전적으로 논리적 인 의견이있을 수 있습니다. 데이터베이스에서 기사를 검색하려면 slug 또는 id 중 하나가 필요하지만 동시에 동일한 기사를 찾기에 충분하다고 생각하면됩니다.

Route::get('article/{id}/{slug?}', array(
    'as' => 'article.show', 
    'uses' => '[email protected]' 
)); 

... 

function show($id, $slug = null) 
{ 

    $article = Article::find($id); 

    if (!$slug) { 
     return Redirect::route('article.show', array($id, $article->slug)); 
    } 

    ... 
} 
:

당신이 정말로 더 "크롤링"URL을 만들기 위해 옵션 슬러그를 원한다면

, SEO-친근, 기억에 남는 또는 무엇을 가지고, 여기에 위의 예에서 구축 제안입니다

누구나 슬러그가없는 URL에 액세스하려고하는 이유는 없습니다.하지만 이는 귀하에게 달려 있고 앱으로 무엇을하려는 것일 수 있습니다. 이렇게하면 적어도 모든 사람이 전체 URL을 사용하여 같은 지점에서 끝나도록하는 동안 슬러그를 '선택적'으로 만들 수 있습니다. 당신은 여전히 ​​솔루션에 대한 여부를 보면 내가 아는 해달라고

Route::get('article/{slug}/{id}', function($slug, $id) 
{ 
    return App::make('ArticleController')->show($id); 
}); 
3

하지만이 같은 문제를했고 나는이 솔루션을 좋아하지 않았다, 나는 이런 짓을 :

+0

이것은 우수합니다;) – fsasvari