2014-03-06 27 views
0

在一个由某个控制器动作调用的函数中,我想立即将浏览器重定向到另一个页面而不返回到控制器。 Anny的建议?如何立即在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)。只有当您的控制器实际返回此对象时才会发生重定向。

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

只是检查你的函数返回;)

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 
} 

不过,我觉得这是最适合你用别的东西作为返回值:instanceof是不漂亮。例如,如果出现错误,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,依此类推)。您也可以使其返回路线本身(请检查is_string($a)以查看myFunction是否返回路线)。

+0

嗨@JohnWHSmith,谢谢你的回复。我理解你的解释,但我正在寻找一种方法来执行重定向而不返回someAction()。正如你描述的那样,我必须测试myFunction()的返回值,这正是我想要避免的。 (因为在这种情况下,我必须在几乎每个控制器操作中更改现有代码) – PBR

+0

重定向只能发生在控制器中,因为它是控制此时路由的组件。 Symfony已经调用了'someAction()',因此在继续之前它正在*等待它终止。如果您希望程序更进一步,您需要结束'someAction()'。正如我所说:*只有当您的控制器实际返回此对象时才会发生重定向。* –