是否可以使 Symfony 2 Action 最初只能从另一个 Action 访问?
Can a Symfony 2 Action be made initially accessible only from another Action?
我很难表达我在问题标题中的意思!我会尽力让这里更有意义...
Symfony 2.7
我有一个表单,在提交并成功验证后,我想将其输入第二个独立的表单,供更多用户使用 activity。我希望第二种形式的初始值由第一种形式提供,但第二种形式是独立的,例如它可以完成自己单独的 submission/validation 个步骤。
我不想:
- 用户可以直接进入第二种形式
- 必须将第二种形式的值作为查询字符串参数传递
- 使用Javascript实现这个
- 以第一种形式将数据保存到数据库并在第二种形式中提取它
从概念上讲,我希望能够验证第一个表单,然后在 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
我很难表达我在问题标题中的意思!我会尽力让这里更有意义...
Symfony 2.7
我有一个表单,在提交并成功验证后,我想将其输入第二个独立的表单,供更多用户使用 activity。我希望第二种形式的初始值由第一种形式提供,但第二种形式是独立的,例如它可以完成自己单独的 submission/validation 个步骤。
我不想:
- 用户可以直接进入第二种形式
- 必须将第二种形式的值作为查询字符串参数传递
- 使用Javascript实现这个
- 以第一种形式将数据保存到数据库并在第二种形式中提取它
从概念上讲,我希望能够验证第一个表单,然后在 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