我是初学者。昨天我测试了Symfony的工具,比如generate:doctrine:crud。我现在看到很多事情我可以做得更容易,然后手动。案例是在分析了我发现的生成代码之后:
$editForm = $this->createForm('AppBundle\Form\TaskType', $task);
我花了一些时间阅读官方文档和一些教程,但我无法找到我怀疑的确切答案。为什么我需要这个部分:AppBundle\Form\TaskType
?它应该包含什么?我看到我可以移动到构建表单的TaskType文件。
$builder->add('name')->add('datetime');
但是,如果我必须为此创建单独的文件,那就没用多少了。有没有办法避免使用TaskType文件?我尝试以这种方式运行任务实体的编辑表单:
$editForm = $this->createForm($task);
但它出错了。此致,卢卡斯
编辑#1 -----任务实体的控制器editAction
/**
* Displays a form to edit an existing task entity.
*
* @Route("/{id}/edit", name="task_edit")
* @Method({"GET", "POST"})
*/
public function editAction(Request $request, Task $task)
{
$deleteForm = $this->createDeleteForm($task);
$editForm = $this->createForm('AppBundle\Form\TaskType', $task);
$editForm->handleRequest($request);
if ($editForm->isSubmitted() && $editForm->isValid()) {
$this->getDoctrine()->getManager()->flush();
return $this->redirectToRoute('task_edit', array('id' => $task->getId()));
}
return $this->render('task/edit.html.twig', array(
'task' => $task,
'edit_form' => $editForm->createView(),
'delete_form' => $deleteForm->createView(),
));
}
和TaskType
class TaskType extends AbstractType
{
/**
* {@inheritdoc}
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('name')->add('datetime');
}
/**
* {@inheritdoc}
*/
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'AppBundle\Entity\Task'
));
}
/**
* {@inheritdoc}
*/
public function getBlockPrefix()
{
return 'appbundle_task';
}
}
这是您正在调用的控制器的方法。
Framework Controller是多个symfony服务的外观。其中之一是FormFactory服务。
要创建您需要的表单:
CreateForm()它在父类中实现,因此它适用于所有类型的表单和实现。
/**
* Creates and returns a Form instance from the type of the form.
*
* @param string|FormTypeInterface $type The built type of the form
* @param mixed $data The initial data for the form
* @param array $options Options for the form
*
* @return Form
*/
public function createForm($type, $data = null, array $options = array())
{
return $this->container->get('form.factory')->create($type, $data, $options);
}