在表单类型中强制使用表单字段

时间:2014-06-05 20:44:22

标签: php symfony

我想添加验证,以便关键字字段表单元素成为必需元素。但这些并不附属于任何类型的实体。我只是要在我的控制器中处理请求。我对HTML5验证不感兴趣,我可以自己做。

规则: Keyword不能为空,Field firstname middlename 值之外不能有任何内容。

表格类型:

class SearchType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $field = array('' => '', 'firstname' => 'Firstname', 'middlename' => 'Middlename');

        $builder
                ->setAction($options['action'])
                ->setMethod('POST')
                ->add('keyword', 'text', array('label' => 'Keyword', 'error_bubbling' => true))
                ->add('field', 'choice', array('label' => 'Field', 'choices' => $field, 'error_bubbling' => true))
                ->add('search', 'submit', array('label' => 'Search'));
    }

    public function getName()
    {
        return 'personsearch';
    }
}

控制器:

class SearchController extends Controller
{
    public function indexAction()
    {
        $form = $this->createForm(new SearchType(), array(),
                array('action' => $this->generateUrl('searchDo')));

        return $this->render('SeHirBundle:Default:search.html.twig',
                array('page' => 'Search', 'form' => $form->createView()));
    }

    public function searchAction(Request $request)
    {
        //I'll carry out searching process here
    }
}

1 个答案:

答案 0 :(得分:1)

文档中的此页面详细说明了如何执行您想要的操作:http://symfony.com/doc/current/book/validation.html

具体来说,通过表单的实现,您可以执行以下操作:

use Symfony\Component\Validator\Constraints\NotBlank;

// ...

$builder
    ->setAction($options['action'])
    ->setMethod('POST')
    ->add('keyword', 'text', array(
        'label'          => 'Keyword', 
        'error_bubbling' => true,
        'constraints'    => array(
            new NotBlank(),
        )
    ))
    ->add('field', 'choice', array(
        'label' => 'Field', 
        'choices' => $field, 
        'error_bubbling' => true
    ))
    ->add('search', 'submit', array(
        'label' => 'Search'
    ))
;

有关详情,请参阅:http://symfony.com/doc/current/book/forms.html#using-a-form-without-a-class

对于您的field元素,您可能需要自己制定一个新约束。


您可能还想查看“验证和表单”部分。我个人更喜欢在进行验证时使用注释方法。

如果要使用该方法,请在模型上添加以下用法语句:

use Symfony\Component\Validator\Constraints as Assert;

然后在要验证的属性上方使用注释:

/**
 * @Assert\NotBlank()
 */
public $name;

可以在此处找到并描述所有可用的约束:http://symfony.com/doc/current/book/validation.html#validation-constraints

从您的代码中,您似乎没有检查表单是否有效,您可以添加此部分,然后在模型被视为有效时重定向到您的搜索操作。