Symfony2将积垢形式与控制器分离


Symfony2 Separate crud form from controller

我使用了./app/console generate:doctrine:crud命令,并注意到它是如何在我的控制器中创建新方法的:"createCreateForm"、"createEditForm"answers"createDeleteForm"。有没有一种方法可以在单个FormType中创建这些crud表单?

当我们看到生成的createEditForm方法时,它看起来像这样:

private function createEditForm(MyEntity $entity)
{
    $form = $this->createForm(new FormType(), $entity, array(
        'action' => $this->generateUrl('MyEntity_update', array('id' => $entity->getId())),
        'method' => 'PUT',
    ));
    $form->add('submit', 'submit', array('label' => 'Update'));
    return $form;
}

FormType.php 中的buildForm方法

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('name')
        ->add('description')
        ->add('save', 'submit')
    ;
}

有没有更好的练习,比如直接将设置传递给buildForm方法?

您可以使用FormTypeInterface#setDefaultOptions:

use Symfony'Component'OptionsResolver'OptionsResolverInterface;
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
    $resolver->setDefaults(array(
        'method' => 'PUT',
    ));
}

您不应该使用action选项来执行此操作,因为这应该由控制器定义。您的表单类型不应该知道应用程序的URL体系结构。

这些应该保留在这里,记住symfony2使用mvc模式,因此应用程序的实体不应该包含与视图或控制器相关的代码。