2014-11-07 2 views
1

Laravel의 컨트롤러에서 즉각적인 리디렉션을하고 싶습니다.Laravel에서 즉석 리디렉션하는 방법

은 내가

public function show($page) 
{ 
    return Redirect::url('http://example.com'); 
} 

을 사용할 수 있습니다 알고 있지만, 예를 들어 조건을 추가하는 많은 컨트롤러에이 코드를 반복합니다 나는 이런 식으로 뭔가 할 싶습니다

public function show($page) 
{ 
    $totalPages = 100; // here calculating maximum page 

    if ($page < 2 || $page > $totalPages) { 
    return Redirect::url('http://example.com'); 
    }  
    // rest of code here - should be run if condition is false 
} 

을하지만 난 돈 ' 각 컨트롤러에서 코드를 반복하고 싶지 않습니다. 나는이 문제를 해결할 수있는 방법

public function show($page) 
{ 
    $totalPages = 100; // here calculating maximum page 
    $this->checkPages($page, $totalPages, 'http://example.com'); 

// rest of code here - should be run if condition is false 
} 

public function checkPages($page, $totalPages, $url) 
{ 
    if ($page < 2 || $page > $totalPages) { 
    return Redirect::url($url); 
    }  
} 

: 나는 다른 방법을 넣어 재 지정 코드를하려고하면

는 메인 컨트롤러에 아무것도 반환하지 않기 때문에이 작동하지 않습니다 (즉, 기본 컨트롤러에 존재할 수) ?

답변

0

파기하는 동안이 목적을 위해 Symfony\Component\HttpFoundation에서 send() 메서드를 사용해야합니다 (Laravel RedirectResponse이이 클래스에서 상속 받음).

그래서 당신은 checkPages 방법이 방법으로 수정할 수 있습니다

public function checkPages($page, $totalPages, $url) 
{ 
    if ($page < 2 or $page > $totalPages) { 
    Redirect::url($url)->send(); 
    }  
} 

를하고는 즉시 리디렉션을 만들 것입니다.

0

기본 컨트롤러에서 메서드의 결과를 반환해야합니다.

return $this->checkPages($page, $totalPages, 'http://example.com');

+0

나는 그것을 알고있다. 하지만이 방법은 항상 리디렉션을 반환하지 않으므로이 메서드를 사용하려는 모든 컨트롤러에 코드를 추가해야합니다. –

0

나는 아마 당신의 checkPages 방법은 너무 많은 일을하려고하는 것이 좋습니다 것입니다. checkPages (validatePageNumber() 또는 그와 유사해야 함)이 으로 리디렉션 되리라 예상합니까? 아니요, true 또는 false을 반환 할 것으로 예상됩니다.

/** 
* Make sure the current page is between 1 and $lastPage 
* 
* @param int $page 
* @param int $lastPage 
* @return bool 
*/ 
protected function validatePageNumber($page, $lastPage) { 
    return $page < 2 || $page > $lastPage; 
} 

지금 컨트롤러 로직은 간단하다 : 당신의 논리대로이 있습니다

이제 우리는 코드를 읽어 준 영어를 사용하는 경우

public function show($page) { 
    $totalPages = 100; 
    if (! $this->validatePageNumber($page, $totalPages)) { 
     return Redirect::url('http://example.com'); 
    } 

    // rest of code here - should be run if condition is false 
} 

, 당신 전체 페이지 수를 설정하고 $page이 유효한지 확인하고 그렇지 않은 경우 어딘지로 리디렉션하는 공용 메서드 show($page)이 페이지를 표시합니다. 이 모든 것은 제어 논리이며 제어기 만 수행해야하는 제어 논리입니다.

validatePageNumber()을 모델 또는 더 나은 ServiceProvider로 추상화 할 수 있으며 하나의 작업을 수행합니다. 숫자가 1과 n 사이인지 확인합니다.

+0

아니요,이 show 메서드는 페이지를 표시하지 않습니다. 이 경우 페이지 매김에 페이지 매개 변수를 가져옵니다. 나는 컨트롤러 로직이 여기에서 사소하다는 것을 알고 있지만,이 경우에이 'if'스테이트먼트는 DRY가 아닌 많은 컨트롤러에서 반복되어야한다.그리고 네, 메소드'isValidPage'도 있습니다. 그리고 실제'checkPage' 메소드는 다음과 같습니다 :'if (! $ this-> isValidPage ($ page, $ pages)) {Redirect :: to ($ url) -> send(); }'. 또한이 방법은 총 페이지 수가 컨트롤러에서 계산되므로 ServiceProvider로 추출 할 수 없다고 생각합니다. 조건에 따라 데이터를 다른 조건으로 수집 할 수 있습니다. –