【问题标题】:Symfony2 - How to render a view from another controllerSymfony2 - 如何从另一个控制器渲染视图
【发布时间】:2013-06-02 10:22:27
【问题描述】:
我有两个控制器,主页和安全。
在主页中,我显示一个视图,在安全性中,我正在做一些事情,其中之一是电子邮件地址验证。
我想要的是,当电子邮件验证码无效时,在主页上显示一条闪烁消息。为此,我必须从 Security 控制器中渲染 HomepageController 的 indexAction,方法是给他作为参数的 flash 消息。
如何做到这一点?我可以从另一个控制器渲染路由或动作吗?
提前谢谢你。
【问题讨论】:
标签:
php
symfony
controller
routing
【解决方案1】:
redirectToRoute : 对当前 symfony 版本的回顾(截至 2016/11/25 v2.3+)
public function genericAction(Request $request)
{
if ($this->evalSomething())
{
$request->getSession()->getFlashBag()
->add('warning', 'some.flash.message');
$response = $this->redirectToRoute('app_index', [
'flash_message' => $request->getSession()->getFlashBag(),
]);
} else {
//... other logic
}
return $response;
}
【解决方案2】:
我认为不应该在安全控制器中进行检查。在我看来,正确的位置是使用电子邮件地址的实体中的单独验证器服务或权限。
但是对于您的问题,您可以使用 $this->forward() 方法调用另一个控制器的操作:
public function indexAction($name)
{
$response = $this->forward('AcmeHelloBundle:Hello:fancy', array(
'name' => $name,
'color' => 'green',
));
return $response;
}
示例来自 symfony2 文档:http://symfony.com/doc/2.0/book/controller.html#forwarding
【解决方案3】:
我已经找到了解决办法,只需通过指定控制器和动作名称来使用转发功能:
return $this->forward('MerrinMainBundle:Homepage:Index', array('flash_message'=>$flash_message));