如何为一个表单类配置空数据

3.4 版本
维护中的版本

empty_data配置选项允许您为表单类指定一个空数据。如果你提交你的表单,这个设置的空数据将会被使用,但他并没有在你的表单中调用setData或者当你创建表单时传入数据。

例如:

1
2
3
4
5
6
7
8
9
10
11
12
public function indexAction()
{
    $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 选项,它将会默认实例化一个新的这个类。该实例通过调用不含参的构造函数创建。

如果你想去重写所有的行为,这里有两种方式可用:

方式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
24
// src/AppBundle/Form/Type/BlogType.php
 
// ...
use Symfony\Component\Form\AbstractType;
use AppBundle\Entity\Blog;
use Symfony\Component\OptionsResolver\OptionsResolver;
 
class BlogType extends AbstractType
{
    private $someDependency;
 
    public function __construct($someDependency)
    {
        $this->someDependency = $someDependency;
    }
    // ...
 
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'empty_data' => new Blog($this->someDependency),
        ));
    }
}

你可以使用你想使用的任何方法来实例化你的类。在这个例子中,我们在BlogType中传入了一些依赖,然后去使用这些依赖去实例化Blog类。关键是,你能够将 empty_data 设置到你想使用的全“新的”对象中。

为了传递参数到BlogType构造函数,你需要去注册它为一个服务并标记form.type标签

方式2:提供一个闭包 

使用闭包是一个更好的选择,因为它只有在对象需要的时候才会被创建。

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

1
2
3
4
5
6
7
8
9
10
11
12
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\FormInterface;
// ...
 
public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults(array(
        'empty_data' => function (FormInterface $form) {
            return new Blog($form->get('title')->getData());
        },
    ));
}

本文,包括例程代码在内,采用的是 Creative Commons BY-SA 3.0 创作共用授权。

登录symfonychina 发表评论或留下问题(我们会尽量回复)