如何为表单类配置空数据
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 许可获得许可。