Symfony不验证对象约束

时间:2012-11-26 10:13:26

标签: forms validation symfony constraints silex

我有一个Silex项目,我使用FormServiceProvider和ValidatorServiceProvider。我使用form.factory构建器创建了一个表单,添加了字段,并将对象用作数据集:

$form = $app['form.factory']->createBuilder('form', $object)

然后我尝试在“正常方式”上验证表格:

if ($app['request']->getMethod() == 'POST') {
    $form->bind($app['request']);
    if ($form->isValid()) {
        (...)
    }
}

在对象中,我添加了一个loadValidatorMetadata静态方法:

static public function loadValidatorMetadata(ClassMetadata $metadata) {
    $metadata->addPropertyConstraint('name', new Assert\MinLength(5, array('message' => 'Name too short')));
}

当我使用较短的名称字段提交表单时,isValid仍然返回true。如果我在对象上运行一个validate方法,如下所示:

$errors = $app['validator']->validate($object)

它根据约束返回错误,但是表单isValid没有找到此错误。当我查看symfony Form类时,我发现当disable config为true时,isValid会跳过检查子字段。这是我的表格的情况,但我不知道为什么。我刚刚以正常方式注册了Silex服务提供商,没有任何特殊配置。知道如何根据对象约束使表单失败验证吗?

1 个答案:

答案 0 :(得分:0)

以下似乎在我的Silex设置中正常工作。也许您只需要调用$form->handleRequest()方法?

<强>控制器

$app->match('/form', function (Request $request) use ($app) {

    $object = new \My\Namespaced\Entity\Object();

    $form = $app['form.factory']->createBuilder('form', $object)
        ->add('name')
        ->add('submit', 'submit')
        ->getForm();

    $form->handleRequest($request);
    if ($form->isValid()) {
        $app['session']->getFlashBag()->add('success', 'Success flash message');
    }
    else {
        $app['session']->getFlashBag()->add('danger', 'Error flash message');
    }

    return new Response($app['twig']->render('form.html.twig', array(
        'form' => $form->createView(),
    )));   

})->bind('form');

对象类

<?php

namespace My\Namespaced\Entity;

use Symfony\Component\Validator\Mapping\ClassMetadata;
use Symfony\Component\Validator\Constraints as Assert;

class Object 
{
    private $name;

    static public function loadValidatorMetadata(ClassMetadata $metadata) {
        $metadata->addPropertyConstraint('name', new Assert\Length(array(
            'min' => 5,
            'minMessage' => 'Name too short',
        )))
        ->addPropertyConstraint('name', new Assert\NotBlank(array(
            'message' => 'Name is required field.'
        )));
    }

    public function setName($name)
    {
        $this->name = $name;

        return $this;
    }

    public function getName()
    {
        return $this->name;
    }
}

树枝模板

{% extends 'layout.html.twig' %}
{% block content %}
    {{ form(form, {action: path('form'), attr:{ 'novalidate': 'novalidate' }}) }}
{% endblock %}