在一个视图中合并来自2个不同控制器的2个动作 - Symfony2

时间:2015-02-16 12:30:02

标签: php symfony model-view-controller controller fosuserbundle

我目前在Symfony2网站上有这样的情况:

  • loginAction SecurityController执行的登录功能。访问其路径时,操作在渲染视图时使用参数(p1,p2,p3)。 (same as FOSUserBundle

  • registerAction中注册functionnality RegistrationController正在使用其他参数p3,p4,p5返回视图。 (same as FOSUserBundle

当表单无效时,参数用于保存错误消息。

我需要显示一个显示两种功能的主页(登录表单和注册表单),但也可以处理由于数据无效而导致的错误。

我可以成功显示主页(MembersManagementBundle::index.html.twig):

{{ render(controller('MembersManagementBundle:Security:login')) }}

{{ render(controller('MembersManagementBundle:Registration:register')) }}

控制器:

class IndexController extends Controller
{

     public function indexAction()
    {
        return $this->render('MembersManagementBundle::index.html.twig');
    }
}

如果输入了良好的值(无论是登录还是注册形式),在表单提交后都会对正确的目标页面执行重定向。

但是,

如果向其中一个表单输入了错误的数据,则会重定向到具有特定错误的特定视图(这是正常的,因为提交表单调用action属性中指定的url,该属性调用相应的操作相应的控制器)。

问题:

是否可以在一个模板中使用所有参数的总和进行两个操作?我应该开发indexAction以便它包含两个动作的逻辑吗?或者还有另一种方法可以将两个操作分开,但将结果合并到indexAction中? 我最终的目标是能够生成包含所需错误的索引页面(p1,p2,p3p4,p5,p6)。

谢谢。非常感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

这就是您现在的流程:

  1. 用户转到索引页面。
  2. 索引页面包括2个表格,在树枝中调用渲染功能。
  3. 用户提交2种表格中的一种。
  4. 表单提交并贯穿表单后面的操作。
  5. 表单只呈现twig模板,因为这就是动作最终的作用。
  6. 现在您需要将其编辑为以下内容:

    1. 1-4是相同的。
    2. 表单再次呈现索引控制器,这将再次呈现2个表单。不能有无限循环,因为不会再从程序逻辑中提交表单。
    3. 现在还剩下一点:由于表单将会运行2次,错误将如何显示?因为它们将在第一次运行中设置,而不是在第二次运行中设置。
    4. 你是怎么做到的:

      您在loginAction中添加一个变量:

      $loginErrorsArray = array();
      

      无论您何时向表单添加错误,都应将其添加到数组中。

      //instead of $form->addError(...);
      $loginErrorsArray['formField'] = $errorMessage;
      

      在渲染表单之前,您将其保存到会话中。

      $this->get('session')->set('loginErrors', $loginErrorsArray);
      

      现在,在代码开头的同一个操作中,您将获取会话变量并运行它,在foreach条目中创建formErrors。之后,在会话中保存一个空数组。

      $loginErrorsArray = $this->get('session')->get('loginErrors');
      foreach($loginErrorsArray as $error){
          $form->addError(...);
      }
      $this->get('session')->set('loginErrors', array());
      

      现在,这将在操作中执行以下操作:

      1. 它得到错误的数组。
      2. 在找到错误时创建错误。 (因为在第一次运行中没有设置错误,所以不会创建)。
      3. 然后它会将找到的所有错误添加到数组中。
      4. 在第二次运行中,它会将数组中的所有错误添加到表单中,但不会为数组创建任何新内容。
      5. 希望这有用。