跳到内容

如何为表单类配置空数据

编辑此页

empty_data 选项允许您为表单类指定一个空数据集。如果您提交表单,但没有在表单上调用 setData() 或在创建表单时传入数据,则将使用此空数据集。例如,在控制器中

1
2
3
4
5
6
7
8
9
10
11
12
public function index(): Response
{
    $blog = ...;

    // $blog is passed in as the data, so the empty_data
    // option is not needed
    $form = $this->createForm(BlogType::class, $blog);

    // no data is passed in, so empty_data is
    // used to get the "starting data"
    $form = $this->createForm(BlogType::class);
}

默认情况下,empty_data 设置为 null。或者,如果您为表单类指定了 data_class 选项,它将默认为该类的新实例。该实例将通过调用不带参数的构造函数来创建。

如果您想覆盖此默认行为,有两种方法可以做到这一点

如果您没有设置 data_class 选项,您可以传递初始数据作为字符串,或者在表单类型是复合类型时传递字符串数组(其中键与字段名称匹配)。

选项 1:实例化一个新类

您可能使用此选项的一个原因是,如果您想使用接受参数的构造函数。请记住,默认的 data_class 选项调用不带参数的构造函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// src/Form/Type/BlogType.php
namespace App\Form\Type;

// ...
use App\Entity\Blog;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\OptionsResolver\OptionsResolver;

class BlogType extends AbstractType
{
    public function __construct(
        private object $someDependency,
    ) {
    }
    // ...

    public function configureOptions(OptionsResolver $resolver): void
    {
        $resolver->setDefaults([
            'empty_data' => new Blog($this->someDependency),
        ]);
    }
}

您可以按照您想要的方式实例化您的类。在本例中,您将一些依赖项传递到 BlogType 中,然后使用它来实例化 Blog 类。关键是,您可以将 empty_data 设置为您想要使用的确切“新”对象。

提示

为了将参数传递给 BlogType 构造函数,您需要将表单注册为服务,并使用 form.type 标记它。如果您使用的是默认的 services.yaml 配置,则已经为您完成了此操作。

选项 2:提供一个闭包

使用闭包是首选方法,因为它只会在需要时创建对象。

闭包必须接受一个 FormInterface 实例作为第一个参数

1
2
3
4
5
6
7
8
9
10
11
12
use Symfony\Component\Form\FormInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
// ...

public function configureOptions(OptionsResolver $resolver): void
{
    $resolver->setDefaults([
        'empty_data' => function (FormInterface $form): Blog {
            return new Blog($form->get('title')->getData());
        },
    ]);
}
这项工作,包括代码示例,根据 Creative Commons BY-SA 3.0 许可获得许可。
目录
    版本