【问题标题】: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));
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-23
        • 1970-01-01
        相关资源
        最近更新 更多