是否可以使 Symfony 2 Action 最初只能从另一个 Action 访问?

Can a Symfony 2 Action be made initially accessible only from another Action?

我很难表达我在问题标题中的意思!我会尽力让这里更有意义...

Symfony 2.7

我有一个表单,在提交并成功验证后,我想将其输入第二个独立的表单,供更多用户使用 activity。我希望第二种形式的初始值由第一种形式提供,但第二种形式是独立的,例如它可以完成自己单独的 submission/validation 个步骤。

我不想:

从概念上讲,我希望能够验证第一个表单,然后在 Controller 中将接收到的数据传递给不同的 Action,这将向用户显示新的 Form。然后,新的 Action 将处理更多的用户提交。我觉得这应该是可能的,我只是不确定如何实现它!在某种程度上,我希望第二个 Action 是私有的,但它确实需要 public 以便可以提交第二个表单。我希望能够使用 object 直接将数据传递给第二个 Action,但我不想将该入口点公开为标准路由。

提前致谢。

对于问题中的任何不明确之处,我们深表歉意。这是我解决它的方法(我仍然对任何 different/better 解决方案感兴趣):

我为第二步创建了单独的 FormType (ReportConfirmType) 和 Action (ConfirmAction)。 ReportConfirmType 具有数据类型 Class,并且基本上与原始 FormType (ReportType) 相同的所有字段,但它们都标记为 readonly。路线非常相似。我还创建了一个私有方法作为第一步和第二步之间的 "glue"。

完成第一步后,我调用私有方法,将第一步中经过验证的数据传递给它(可以不加改变地使用)。此方法设置第二个表单和 returns 第二个视图。表单的action需要改成第二条路由的action

所有后续提交都将转到新路线,当第二个表单通过验证时,我可以执行流程的最后活动。

这里有一些示例代码可以进一步说明:

报告类型

class ReportType extends AbstractType{

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('name', 'text')
        ->add('completedBy', 'text')
        ->add('comments', 'textarea', ['required' => false])
        ->add('format', 'choice', ['choices' => ['pdf' => 'PDF', 'word' => 'MS Word'] ])
        ->add('save', 'submit', ['label' => 'Submit', 'attr' => ['class' => 'btn btn-primary']])
        ->getForm();
}

...

ReportConfirmType

class ReportConfirmType extends AbstractType{

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('name', 'text', ['attr' => ['readonly' => 'readonly']])
        ->add('completedBy', 'text', ['attr' => ['readonly' => 'readonly']])
        ->add('comments', 'textarea', ['required' => false, 'attr' => ['readonly' => 'readonly']])
        ->add('format', 'choice', ['choices' => ['pdf' => 'PDF', 'word' => 'MS Word'], 'attr' => ['readonly' => 'readonly'] ])
        ->add('agree', 'checkbox', ['mapped' => false, 'label' => 'I agree', 'constraints' => [new IsTrue()]])
        ->add('save', 'submit', ['label' => 'Submit', 'attr' => ['class' => 'btn btn-primary']])
        ->getForm();
}

...

ReportController

class ReportController extends Controller
{

public function indexAction(Request $request, $id)
{
    $form = $this->createForm(new ReportType(), new ReportDetails() );

    $form->handleRequest($request);

    if ($form->isValid()) {
        return $this->confirmPseudoAction($id, $form);
    }

    return $this->render('Bundle:Report:index.html.twig', ['form'=> $form->createView()]);
}

private function confirmPseudoAction($id, \Symfony\Component\Form\Form $form)
{
    $action = $this->generateUrl('form_confirm_report', ['id' => $id]);
    $confirmForm = $this->createForm(new ReportConfirmType(), $form->getData(), ['action' => $action]);

    return $this->render('Bundle:Report:confirm.html.twig', ['form'=> $confirmForm->createView()]);
}

public function confirmAction(Request $request, $id)
{
    $form = $this->createForm(new ReportConfirmType(), new ReportDetails() );

    $form->handleRequest($request);

    if ($form->isValid()) {
        return $this->generateReport($id, $form->getData());
    }

    return $this->render('Bundle:Report:confirm.html.twig', ['form'=> $form->createView()]);
}

...

routing.yml

form_report:
    path: /form/{id}/report
    defaults: { _controller: Bundle:Report:index }
    requirements:
        id:  \d+

form_confirm_report:
    path: /form/{id}/reportConfirm
    defaults: { _controller: Bundle:Report:confirm }
    requirements:
        id:  \d+

这就是我想要的!可能有更简单的方法,但我现在已经做到了...

我相信您可以对提交的表单使用动态生成。 It allows you to customize the form specific to the data that was submitted by the user