Symfony3在类型文件中创建没有实体的表单

时间:2017-03-28 14:10:30

标签: php symfony symfony-forms

我在我的控制器中创建了一个表单,如下所示:

$data = array ();
$formBuilder = $this->createFormBuilder ( $data );
$formBuilder->add( 'Field1', NumberType::class, array(
                    'constraints' => array(
                            new NotBlank(),
                    ),
            ) )
            ->add ( 'Field2', NumberType::class, array(
                    'constraints' => array(
                            new NotBlank(),
                    )
...);
$form = $formBuilder->getForm ();

我正在尝试将表单创建放在Type文件中。我是这样做的,但表单没有创建,我无法在视图中显示表单字段。我不明白为什么。

#in ControlController
$data = array ();
$formBuilder= $this->createFormBuilder(ControlType::class, $data);
$form = $formBuilder->getForm ();

#in ControlType
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add( 'Field1', NumberType::class, array(
                    'constraints' => array(
                            new NotBlank(),
                    ),
            ) )
            ->add ( 'Field2', NumberType::class, array(
                    'constraints' => array(
                            new NotBlank(),
                    )....;
}

编辑1: 我已经尝试过你告诉我的所有事情,但它仍然无效。 我的代码现在看起来像这样:

#in ControlController
$data = ['Field1' => null, 'Field2' => null];
$formBuilder= $this->createFormBuilder(ControlType::class, $data);
$form = $formBuilder->getForm ();
return $this->render ( 'MeTestBundle:Control:index.html.twig', array (
            'form' => $form->createView () 
    ) );

#in ControlType
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add( 'Field1', NumberType::class, array(
                            'mapped' => false,
    ) )
    ->add ( 'Field2', NumberType::class, array(
            'constraints' => array(
                    new NotBlank(),
            ),
            'mapped' => false
    ))
    ->add ( 'save', SubmitType::class, array (
            'label' => 'Control'
    ));
}

public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults(array(
            'data_class' => Control::class,
    ));
}

但是现在我遇到的错误是选项“Field1”,“Field2”不存在。定义的选项包括:“action”,“allow_extra_fields”,“attr”,“auto_initialize”,“block_name”,“by_reference”,“compound”,“constraints”,“csrf_field_name”,“csrf_message”,“csrf_protection”,“csrf_token_id “,”csrf_token_manager“,”data“,”data_class“,”disabled“,”empty_data“,”error_bubbling“,”error_mapping“,”extra_fields_message“,”inherit_data“,”invalid_message“,”invalid_message_parameters“,”label“, “label_attr”,“label_format”,“mapped”,“method”,“post_max_size_message”,“property_path”,“required”,“translation_domain”,“trim”,“upload_max_size_message”,“validation_groups”。

1 个答案:

答案 0 :(得分:2)

您的控制器代码创建表单似乎是错误的。

Controller中的createFormBuilder签名定义如下:

public function createFormBuilder($data = null, array $options = array())

你想要的应该是:

$data = ['Field1' => null, 'Field2' => null];
$form = $this->createForm(ControlType::class, $data);
return $this->render ( 'MeTestBundle:Control:index.html.twig', array (
        'form' => $form->createView () 
));

编辑: 如果您不使用数据对象,也不应设置data_class。 在这种情况下,请将configureOptions留空。 如果要使用实体,则应将其实例作为$data而不是简单数组传递。