首页 > 解决方案 > Symfony5 表单:如何默认禁用所有字段的“必填”?

问题描述

描述

Symfonyrequired = true默认具有所有输入字段: https ://symfony.com/doc/current/reference/forms/types/text.html#required

我正在寻找禁用这种行为的方法。

发现

1.明确要求=假

当然,最简单的方法是传递['required' => false]给每个字段。但这有点笨拙。

2.助手类

然后,我创建了一个帮助类来构建根据我的需要调整的表单。它只是附加['required' => false]到每个字段。它可以工作——除了提交按钮或类似的东西——对他们来说 Symfony 会抛出一个错误:

Symfony\Component\OptionsResolver\Exception\UndefinedOptionsException: The option "required" does not exist. Defined options are: "attr", "attr_translation_parameters", "auto_initialize", ...

我试图找到一种方法来获取字段的可用选项列表 - 但它们隐藏得很好,未能发现它们。

3. required=false 到表格

我也尝试放入['required' => false]最顶级的形式。嗯......它的行为很奇怪:

问题

那么,有没有正确的方法来解决这个问题呢?它可能是一些method()用于获取特定字段的可用选项 - 所以我可以跳过required没有它的字段设置。或者一些我不知道的方法。

编辑 1

尝试了写在https://stackoverflow.com/a/65825111/982746中的解决方案

这是我的测试代码:

<?php
require_once __DIR__.'/../../lib/vendor/autoload.php';

use \Symfony\Component\Form\Forms;
use \Symfony\Component\Form\AbstractTypeExtension;
use \Symfony\Component\Form\Extension\Core\Type as T;



class NotRequiredExtension extends AbstractTypeExtension {
    public static function getExtendedTypes (): iterable {
        return [T\FormType::class];
    }

    public function configureOptions ($resolver) {
        $resolver->setDefault('required', false);
    }
}



$builder = Forms::createFormFactoryBuilder()
    ->addTypeExtension(new \NotRequiredExtension())
    ->getFormFactory()
    ->createBuilder(T\FormType::class, ['inherit'=>'', 'required_true'=>'', 'required_false'=>''])
;

$form = $builder
    ->add('inherit',        T\TextType::class)
    ->add('required_true',  T\TextType::class, ['required'=>true])
    ->add('required_false', T\TextType::class, ['required'=>false])
    ->getForm()
;

$formView = $form->createView();

var_dump($formView->children['inherit']->vars['required']); //false
var_dump($formView->children['required_true']->vars['required']); //false
var_dump($formView->children['required_false']->vars['required']); //false

似乎它不起作用 - 类似于我的实验#3:如果我设置required=false为表单类型,symfony 然后拒绝更改required任何true单个字段 - 所有的var_dump()s 显示false

标签: symfonysymfony-forms

解决方案


您可以创建表单扩展名AbstractTypeExtension

namespace App\Form\Extension;

use Symfony\Component\Form\AbstractTypeExtension;
use Symfony\Component\Form\Extension\Core\Type\FormType;
use Symfony\Component\OptionsResolver\OptionsResolver;

class NoRequiredExtension extends AbstractTypeExtension
{
    public function configureOptions(OptionsResolver $resolver): void
    {
        $resolver->setDefault('required', false);
    }

    public static function getExtendedTypes(): iterable
    {
        return [FormType::class];
    }
}

推荐阅读