gpt4 book ai didi

forms - Symfony 不验证对象约束

转载 作者:行者123 更新时间:2023-12-03 17:54:24 25 4
gpt4 key购买 nike

我有一个使用 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 服务提供商,没有任何特殊配置。知道如何根据对象约束使表单验证失败吗?

最佳答案

以下似乎在我的 Silex 设置中运行良好。也许您只需要调用$form->handleRequest()方法?

Controller

$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;
}
}

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

关于forms - Symfony 不验证对象约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13562636/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com