symfony2:多页表单传递实体


symfony2: multipage form - passing entities

stack:symfony2/doctrine2/php/mysql

由两个步骤组成的多页形式。每个步骤都在控制器动作中实现。

在步骤1中,显示表单。表单输入在相同的操作中得到验证。如果表单有效,则应将用户重定向到第二个步骤/操作。在第二步骤中,用户必须确认他的输入。确认后,数据应存储在数据库中。

因此在第二步骤/动作中需要表单实体/表单数据。但是,我不想在确认之前将其存储在数据库中。

我真的需要序列化所有对象吗?参加会议?有更好的方法吗?

有什么建议吗?

首先,我建议在发布之前通过JavaScript验证输入,而不是在服务器上的控制器操作中。

如果你不想将数据序列化到会话,你可以简单地在第一个操作中收到数据时将其传递到下一个页面,然后将其发布到第二个操作,我想象的是这样的:

firstAction() {
  $exampleData = $_POST['exampleData'];
  // Do whatever you need, then pass the data on to the next page
  return $this->render('SomeBundle:Views:secondPage.html.php',
                       array('exampleData' => $exampleData));

在第二个页面上,您只需要使用JavaScript访问$exampleData,并最好将其放在表单中的某个隐藏输入字段中

<!-- secondPage.html.php -->
<script type="text/javascript">
    var exampleData = <?php echo $exampleData ?>;
    $('#hiddenInput').val(exampleData);
</script>

然后,第二个控制器操作也将接收$exampleData,而不在会话中序列化它。

很抱歉,如果有任何语法错误,已经有一段时间没有使用symfony2了:)

尝试使用序列化,但实体非常复杂,有"许多"关联。因此序列化太慢。即使在分离之后。

第一个解决方案(简化):

将POST变量存储到第一步骤/操作中的会话中。

    $postParams = $this->getRequest()->request;
    $session = $this->getRequest()->getSession();
    if (!$session) {
        $session = new Session();
    }
    $session->set($sessionKey, $postParams);

在第二步/操作中,我使用表单重新填充实体。

    $cancellation = $manager->initCancellationSomehow();
    $session = $this->getRequest()->getSession();
    if (!$session) {
        $session = new Session();
    }
    $parameterBag = $session->get($sessionKey);
    $cancellation = $this->getCancellation($customerId);
    $form = $this->createForm(
        new CancellationType(),
        $cancellation,
        array(
            'em' => $this->getDoctrine()->getManager())
    );
    $form->bind($parameterBag->get('form'));
    [..]

第二种解决方案:

我的第一个想法是将取消存储在数据库中。因此我添加了一个状态属性(active/temp/..)。未经确认的取消将标记为temp。如果用户确认状态从CCD_ 5变为CCD_。临时集合在小时后被以低优先级运行的垃圾收集器删除。

我喜欢第二种解决方案,因为用户必须确认最终取消,该取消已经存储在数据库中。如果前端没有按预期工作,用户可能会注意到损坏的取消(例如,选择了错误的条目)。如果他确认了,只会改变状态。感觉很安全。在第一个解决方案中,用户确认数据库中应该存储什么,但直到现在还没有。感觉不安全。