2014-12-16 10 views
0

후 무시 나는 다음과 같은 경로를 가지고 말 :Laravel 4 필터

Route::any('/door1/{options?}', array(
     'as' => 'path', 
     'after' => 'somefilter', 
     'uses' => '[email protected]' 
    )) 

어디에 내 필터는 DB 테이블에 어떤 값을 증가 할 수있는 작업을 한 후. 옵션 매개 변수가 유효한 경우 모든 괜찮 특정보기를 호출, 그렇지 않으면 옵션을 "수정"하고로 리디렉션 컨트롤러에 관해서는

Route::filter('somefilter', function($route, $request, $response, $action) 
    { 
     try 
     { 
      //... 
      IncrementDBTable(); 
      //... 
     } 
     catch(Exception $e) 
     { 
      return Redirect::home(); 
     } 
    }); 

, : 필터는 다음과 같을 것

public function path($options='option1,option2') 
    { 
     if(!this->isValidOptions($options)) { 
      $options = this->correctOptions($options); 
      return Redirect::route('path', array(
       'options' => $options 
      )); 
     } 

     // everything fine: 
     return View::make('door'); 
    } 

내 문제이며, 옵션이 잘못되는 경우에, 필터 후 두 번도 수행되는 DB 테이블에 증가를 의미, 두 번 호출됩니다 같은 길을 수행한다. 옵션이 잘못 된 경우 필터를 "무시"할 수 있습니까? 물론 가능한 해결책은 필터 함수 내부의 옵션을 검증하는 것입니다. 그러나 코드를 복제하는 것은 좋지 않습니다. (이것은 간단한 예제 일 뿐이지 만, 옵션 옵션의 유효성 검사 기능이 코드를 더 많이 포함한다면 상황이 안 좋을 것입니다. 아마도 db 쿼리의 무리).

+1

흠 컨트롤러 내부에서 카운팅을 할 수 있으므로 제어 할 수 있습니다. – lukasgeiter

+0

그래, 왜 처음부터 필터에서 이러는거야? –

+0

그게 바로 필터가 맞다고 생각하니? 내 필터가 특정 페이지/경로의 페이지 뷰를 증가시키는 것입니다. 내 애플 리케이션의 다른 페이지에 대해 그렇게하고 싶다고 가정 해 봅시다. 그렇다면 각 컨트롤러 메소드가 해당 기능을 구현하는 대신 여러 페이지/경로에 대해 여러 필터를 사용하는 것이 훨씬 더 우아 할 것입니다. 나는 가능한 한 최소한으로 컨트롤러를 코딩하려고하고있다. – Jonas

답변

0

코드를 보면 옵션을 수정 한 후 Redirect을 건너 뛰고 대신 기능을 계속 수행 할 수 있습니다. 옵션을 수정 한 후 리디렉션 할 이유가 표시되지 않습니다. 또한 after 필터가 두 번 호출되는 문제를 해결할 것입니다.

+0

네, 맞습니다. 내 잘못, 내가 준 예제는 너무 단순하다. 내가 가진 실제 시나리오는 URL을 수정해야한다는 것입니다. 예를 들어 www.myapp.com/Z/XPTO를 입력하면 XPTO가 유효성 검사에 실패 할 수 있으므로 내 컨트롤러가 www.myapp.com/X/XPTO로 리디렉션됩니다 (쌍이 짝이 맞는 테이블이 있다고 가정 해 봅시다). X-XPTO가 아니라 Z-XPTO). 나는 이것이 의미를 갖기를 바란다. – Jonas

+0

그래서'''path'' 경로로 실제로 리디렉션하지 않는다는 말입니까? – lowerends

+0

네,하지만 다른 매개 변수가 있습니다. 위의 논리에 따라 www.myapp.com/Y/XPTO (Route :: any ('/ {match1}/{match2}')에서 www.myapp.com/X/XPTO로 리디렉션합니다. – Jonas