Documentação do Symfony - versão 3.1
Renderizada do repositório symfony-docs-pt-BR no Github

Como configurar Dados Vazios para uma Classe de Formulário

A opção empty_data permite que você especifique um conjunto de dados vazios para a sua classe de formulário. Este conjunto de dados vazios será usado se você fez o bind do seu formulário, mas não chamou o setData() nele ou não passou dados quando criou ele. Por exemplo:

public function indexAction()
{
    $blog = // ...

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

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

Por padrão, o empty_data é setado como null. Ou, se você especificou a opção data_class para a sua classe de formulário, ele será, por padrão, uma nova instância dessa classe. Essa instância será criada chamando o construtor sem argumentos.

Se você quiser sobrescrever esse comportamento padrão, existem duas formas de fazer isso.

Opção 1: Instanciar uma nova Classe

Uma razão para usar esta opção é se você quer usar um construtor que possui argumentos. Lembre-se, a opção data_class padrão chama o construtor sem argumentos:

// src/Acme/DemoBundle/Form/Type/BlogType.php
// ...

use Symfony\Component\Form\AbstractType;
use Acme\DemoBundle\Entity\Blog;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

class BlogType extends AbstractType
{
    private $someDependency;

    public function __construct($someDependency)
    {
        $this->someDependency = $someDependency;
    }
    // ...

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'empty_data' => new Blog($this->someDependency),
        ));
    }
}

Você pode instanciar sua classe como desejar. Neste exemplo, nós passamos algumas dependências para o BlogType ao instanciá-lo, então, use isso para instanciar o objeto Blog. O ponto é, você pode setar o empty_data para o objeto “novo” que você deseja usar.

Opção 2: Fornecer uma Closure

Usar uma closure é o método preferido, uma vez que irá criar o objeto apenas se for necessário.

A closure deve aceitar uma instância FormInterface como seu primeiro argumento:

use Symfony\Component\OptionsResolver\OptionsResolverInterface;
use Symfony\Component\Form\FormInterface;
// ...

public function setDefaultOptions(OptionsResolverInterface $resolver)
{
    $resolver->setDefaults(array(
        'empty_data' => function (FormInterface $form) {
            return new Blog($form->get('title')->getData());
        },
    ));
}