为什么我需要在 createForm 中使用 TaskType?
Why do I need TaskType in createForm?
我是初学者。昨天我测试了 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(),
));
}
和任务类型
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() 它在父级 class 中实现,因此它对所有类型的表单和实现都是通用的。
Symfony\Bundle\FrameworkBundle\Controller\Controller
/**
* 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);
}
我是初学者。昨天我测试了 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(),
));
}
和任务类型
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() 它在父级 class 中实现,因此它对所有类型的表单和实现都是通用的。
Symfony\Bundle\FrameworkBundle\Controller\Controller
/**
* 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);
}