为什么我需要在 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 服务。

要创建您需要的表单:

  1. 表单类型(必填)
  2. 数据(可选)
  3. 表单选项(可选)

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);
    }