使用Symfony2 form组件实现搜索表单


Implementation of a search form with Symfony2 Form Component

也许我有一个非常愚蠢的问题,但我是Symfony2的新手,我想知道我是否可以用Symfony Form组件构建一个搜索表单,就像我处理注册表一样。

我的搜索表单将有一个国家选择字段、俱乐部选择字段、性别单选按钮字段、级别选择字段和提交按钮。

是否可以使用表单组件来实现这一点,或者做类似的事情——最好直接在视图中构建搜索表单?

我一直在寻找这方面的信息,但什么也没找到。

以下是我的SearchPlayerType.php的外观。

<?php 
namespace AppBundle'Form;
use Symfony'Component'Form'AbstractType;
use Symfony'Component'Form'FormBuilderInterface;
use Symfony'Component'OptionsResolver'OptionsResolver;
use Symfony'Component'Form'FormEvents;
use Doctrine'ORM'EntityRepository;
class SearchPlayersType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('country', 'entity', array(
            'placeholder' => 'Choose a country',
            'class' => 'AppBundle:Country',
            'property' => 'name',
            'query_builder' => function(EntityRepository $er){
                return $er->createQueryBuilder('c')->orderBy('c.name', 'ASC');
            },
            ))
        ->add('club', 'entity', array(
            'placeholder' => 'Choose a club',
            'class' => 'AppBundle:Club',
            'property' => 'name',
            'query_builder' => function(EntityRepository $er){
                return $er->createQueryBuilder('c')->orderBy('c.name', 'ASC');
            },
            ))
        ->add('gender', 'entity', array(
            'class' => 'AppBundle:Gender',
            'property' => 'name',
            'expanded' => true
            ))
        ->add('level', 'rating', array(
            'label' => 'Playing Level',
            'stars' => 5))
    ;
}
public function getName()
{
    return 'SearchPlayer';
}

如果可以这样做,我不知道我的数据类需要是的哪个实体

public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults(array(
        'data_class' => 'AppBundle'Entity'Usuario'
    ));
}
}
?>

您可以使用两种方法:您可以为搜索表单创建一个特定于表单的模型,该模型要么是一个具有公共属性的非常瘦的对象;或者,您可以在表单选项中删除data_class的条目,这将使表单切换为返回数组而不是对象(文档)。

前者是一种更面向对象的方式,允许您添加验证注释,而无需将其嵌入表单中,这种方式还意味着您可以添加getter和setter,它们可以非常容易地转换搜索数据,而不会弄乱控制器。所以你的模型看起来像:

namespace MyBundle'Form'Model;
class SearchModel
{
    public $country;
    public $club;
    // ...
}

备选方案只是:

public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults(array(
        // don't set 'data_class' in here
    ));
}

然后,当您执行$form->getData()时,您只会得到一个数组,而不是一个对象。