2014-03-06 4 views
0

특정 컨트롤러 동작에서 호출되는 함수에서 컨트롤러로 돌아 가지 않고 브라우저를 다른 페이지로 즉시 리디렉션하려고합니다. 애니 제안? Symfony에서 '즉시'리디렉션하는 방법?

그냥 분명히, 컨트롤러 내부 단지를 위해 설명 기능은 다음 두 가지로 보이게하기 :

public function someAction ($value) 
{ 
    $a = $this->myFunction($value); 

    // I don't want to come here if something wrong with $value 
} 

public function myFunction ($value) 
{ 
    if ($value == '') 
    { 
     $this->redirect($this->generateUrl('someRoute')); 
    } 

    return 10; 
} 
+0

myFunction에 예외를 던질 수도 있습니다. 나는 당신이 정말로 PHP 헤더 명령을 사용하여 종료하고 싶다면 가정합니다. 권장하지 않습니다. 결론 : 생각을 조금 조정해야합니다. @White는 올바른 접근법을 가지고있다. – Cerad

답변

-1

이 경우 컨트롤러에 대한 이벤트 리스너를 만들어 문제를 해결했습니다. 각 someAction() 전에 실행됩니다. 저기서 테스트를하고 필요할 경우 사용자를 리디렉션합니다. 더 좋은 점을 확인하기 위해 myFunction()이 필요 없기 때문에 나에게 좋은 해결책이 될 것입니다.

+0

이 작업을 수행하는 방법에 대한 자세한 내용은 유용 할 것입니다. – Tom

3

귀하의 $this->redirect(); 호출은 RedirectResponse 객체 (API reference를) 만들었습니다. 리디렉션은 컨트롤러가 실제로이 객체를 반환하는 경우에만 발생합니다. instanceof 꽤되지 않습니다 :

use Symfony\Component\HttpFoundation\RedirectResponse; 

public function someAction ($value) 
{ 
    $a = $this->myFunction($value); 
    if($a instanceof RedirectResponse) return $a; 

    // You won't come here if something wrong with $value 
} 

아직도, 당신이 반환 값으로 다른 것을 사용하는 것이 가장 좋은 거라고 생각)

return $this->redirect($this->generateUrl('someRoute')); 

그냥 어떤 함수의 반환을 확인합니다. 예를 들어 C 루틴은 일이 잘못되어 -1을 반환합니다. 당신은 NULL 아마도 사용하여 비슷한 일을 할 수있는 :

public function myFunction ($value) 
{ 
    if ($value == '') 
    { 
     return NULL; // Or something else (as long as it is illogical for your function to return it). 
    } 

    return 10; 
} 

public function someAction ($value) 
{ 
    $a = $this->myFunction($value); 
    if(is_null($a)) return $this->redirect($this->generateUrl('someRoute')); 

    // You won't come here if something wrong with $value 
} 

참고 : 당신은 (아마도 음수?) 다른 반환 값을 사용하여 경로를 결정하고, 그것을 다시 경로를 일치하도록 myFunction를 원하는 경우 컨트롤러 (myFunction이 -1을 반환하면 route1으로 이동하고 -2를 반환하면 route2 등이됩니다). 경로 자체를 반환하도록 할 수도 있습니다 (myFunction이 경로를 반환했는지 확인하려면 is_string($a)을 확인하십시오).

+0

안녕하세요 @ JohnWHSmith, 귀하의 책임에 대해 감사드립니다. 귀하의 설명을 이해하지만 someAction() returnig없이 리디렉션 할 수있는 방법을 찾고 있어요. 당신이 그것을 설명하면서, 나는 myFunction()의 리턴 값을 테스트해야만한다. 그리고 그것은 내가 피하고 싶은 바로 그 것이다. (이 경우 거의 모든 컨트롤러 동작에서 기존 코드를 변경해야하기 때문에) – PBR

+0

리디렉션은 컨트롤러에서 발생하며이 시점에서 라우팅을 제어하는 ​​구성 요소입니다. Symfony는'someAction()'을 호출 했으므로, 계속하기 전에 종료 될지 기다리고 있습니다. 프로그램을 더 원한다면'someAction()'을 끝내야한다. 내가 말한대로 : 리디렉션은 컨트롤러가 실제로이 객체를 반환하는 경우에만 발생합니다. * –

관련 문제