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

Posted

技术标签:

【中文标题】将选项从控制器传递到嵌入式 Symfony 表单时,选项不存在错误【英文标题】:Option does not exist error when passing through option from controller to embedded Symfony form 【发布时间】:2016-01-25 10:35:24 【问题描述】:

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

“numOfHoles”选项不存在。定义的选项有:“action”、“allow_extra_fields”、“attr”、“auto_initialize”、“block_name”、“by_reference”、“cascade_validation” ,“复合”,“约束”,“csrf_field_name”,“csrf_message”,“csrf_protection”,“csrf_provider”,“csrf_token_id”,“csrf_token_manager”,“数据”,“data_class”,“禁用”,“empty_data”,“ error_bubbling”、“error_mapping”、“extra_fields_message”、“inherit_data”、“intention”、“invalid_message”、“invalid_message_parameters”、“label”、“label_attr”、“label_format”、“mapped”、“max_length”、“method” 、“模式”、“post_max_size_message”、“property_path”、“read_only”、“required”、“translation_domain”、“trim”、“validation_groups”、“virtual”。

在我的控制器中:

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

crmpicco_course_row表单类中:

public function buildForm(FormBuilderInterface $builder, array $options)

    $builder
        ->add('name', 'text')
        ->add('course', 'crmpicco_course', array('numOfHoles' => $options['numOfHoles']))
    ;

crmpicco_course表单类中:

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';

谁能明白为什么numOfHoles 选项没有通过?

【问题讨论】:

您必须在表单构建器的configureOptions(OptionsResolver $resolver) 中使用setDefaultssetRequired 函数添加numOfHoles 选项。 【参考方案1】:

尝试这样做:

$numOfHoles = array('numOfHoles' => $options['numOfHoles']));

然后:

$oForm = $this->createForm(new CompanyForm($numOfHoles));

那么你需要在你的 buildForm 之前调用它:

public function __construct($contacts))

$this->vnumOfHoles = $numOfHoles;

【讨论】:

【参考方案2】:

正如您所发现的,每种表单类型都有一个预定义的选项列表。添加新选项需要稍作调整。实际方法在 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,
    ));

到你的表单类型,你应该很高兴。

【讨论】:

data_class 中设置哪个类?【参考方案3】:

我在视频中看到您需要创建一个表单类型扩展来“发明”选项:

https://symfonycasts.com/screencast/symfony-forms/form-type-extension#play

“事实证明,你不能只是“发明”新选项并传递它们:每个字段都有一组具体的有效选项。但是,在 TextareaSizeExtension 中,我们可以发明新选项。”

例如当需要添加行属性时,在扩展中这样做:

   public function buildView(FormView $view, FormInterface $form, array $options)
    
        $view->vars['attr']['rows'] = $options['rows'];
    

public function configureOptions(OptionsResolver $resolver)
    
        $resolver->setDefaults([
            'rows' => 10
        ]);
    

现在在 buildForm 方法中,当您添加一个字段时,您可以通过这种方式传递选项:

->add('content', null, ['rows' => 15])

这至少应该适用于视频中提到的 symfony 4,也可能是 3.4。

刚刚观看了另一个视频https://symfonycasts.com/screencast/symfony-forms/form-options-data 并看到与 Cerad 回答的相同。所以现在据我了解,只有当我们想要扩展第三方表单类型时,我们才需要 formExtention。

【讨论】:

以上是关于将选项从控制器传递到嵌入式 Symfony 表单时,选项不存在错误的主要内容,如果未能解决你的问题,请参考以下文章

Symfony:嵌入式表单集合中的独特选项

如何将参数从控制器传递给 FormType 构造函数

将参数传递给 symfony 5.4 表单测试不起作用

将导航控制器添加到视图时无法传递数据

如何从子表单中获取父 Symfony3 表单的值?

如何将值从表单传递到数据表