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


Merge 2 actions from 2 different controllers in one view - Symfony2

我有Symfony2网站的当前情况:

  • 由CCD_ 1在CCD_ 2中执行的登录功能。访问其路线时,动作在渲染视图时使用参数(p1、p2、p3)。(与FOSUserBundle相同)

  • RegistrationController中的寄存器函数registerAction正在使用其他参数p3、p4、p5返回视图。(与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. 用户转到索引页面
  2. 索引页包括两个表单,因为调用了trick中的render函数
  3. 用户提交两个表单中的一个
  4. 表单提交并运行表单后面的操作
  5. 表单只渲染树枝模板,因为这是操作最终要做的事情

现在您需要将其编辑为以下内容:

  1. 1-4是相同的
  2. 表单再次呈现索引控制器,索引控制器将再次呈现2个表单。不可能存在无限循环,因为程序逻辑不会再次提交表单
  3. 现在剩下一点:由于表单将操作运行2次,错误将如何显示?因为它们将在第一轮比赛中设置,但不会在第二轮比赛中

你就是这么做的:

您在登录操作中添加一个变量:

$loginErrorsArray = array();

无论在哪里向表单添加错误,都会将其添加到数组中。

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

在呈现表单之前,您要将其保存到会话中。

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

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

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

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

  1. 它获取带有错误的数组
  2. 为发现的每个错误创建错误。(由于在第一次运行中没有设置错误,因此不会创建错误)
  3. 然后,它会将找到的所有错误添加到数组中
  4. 在第二次运行中,它会将数组中的所有错误添加到表单中,但不会为数组创建任何新错误

希望这是有益的。