将选项从控制器传递到嵌入式 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)
中使用setDefaults
或setRequired
函数添加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 表单时,选项不存在错误的主要内容,如果未能解决你的问题,请参考以下文章