【问题标题】:Symfony does not validate object constraintsSymfony 不验证对象约束
【发布时间】:2012-11-13 19:10:51
【问题描述】:

我有一个使用 FormServiceProvider 和 ValidatorServiceProvider 的 Silex 项目。我使用 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。如果我像这样在对象上运行验证方法:

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

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

【问题讨论】:

    标签: forms validation symfony constraints silex


    【解决方案1】:

    以下似乎在我的 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 %}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-17
      • 1970-01-01
      • 1970-01-01
      • 2017-03-10
      • 2015-01-11
      • 1970-01-01
      • 1970-01-01
      • 2018-02-07
      相关资源
      最近更新 更多