从控制器到嵌入式Symfony表单传递选项时,选项不存在错误

crm*_*cco 16 php forms symfony-forms symfony php-5.6

当我尝试在我buildForm的一个表单中传递一个选项到我的方法时,我收到以下错误.

选项"numOfHoles"不存在.定义的选项包括:"action","allow_extra_fields","attr","auto_initialize","block_name","by_reference","cascade_validation","compound","constraints","csrf_field_name","csrf_message","csrf_protection ","csrf_provider","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","max_length","method","pattern","post_max_size_message","property_path","read_only","required" ","translation_domain","trim","validation_groups","虚拟".

在我的控制器中:

// hardcoded here for brevity in this example
$form = $this->createForm('crmpicco_course_row', $courseRow, array('numOfHoles' => 18));
Run Code Online (Sandbox Code Playgroud)

crmpicco_course_rowForm类中:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('name', 'text')
        ->add('course', 'crmpicco_course', array('numOfHoles' => $options['numOfHoles']))
    ;
}
Run Code Online (Sandbox Code Playgroud)

crmpicco_courseForm类中:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    for ($i = 0; $i < $options['numOfHoles']; $i++) {
        $builder->add($i, 'text', array('required' => 'false'));
    }
}

/**
 * @return string name
 */
public function getName()
{
    return 'crmpicco_course';
}
Run Code Online (Sandbox Code Playgroud)

任何人都可以看到为什么选项numOfHoles没有通过?

Cer*_*rad 25

正如您所发现的,每种表单类型都有一个预定义的选项列表.添加新选项需要稍作调整.实际方法在Symfony开发过程中发生了变化,因此您可能会遇到一些较旧的折旧解决方案.

这里讨论最新的解决方案:http://symfony.com/blog/new-in-symfony-2-7-form-and-validator-updates#deprecated-setdefaultoptions-in-favor-of-configureoptions

所以基本上添加

public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults(array(
        'data_class' => 'AppBundle\Entity\Whatever',
        'numOfHoles' => 0,
    ));
Run Code Online (Sandbox Code Playgroud)

对于你的表单类型,你应该很高兴去.