forms - 交响乐团 3 : Error message of embedded form with contraint on class property

标签 forms symfony validation

如果一个类具有另一个类的属性,则可以使用 Valid() 注解进行级联验证,如documentation所示.

我已经为该示例构建了一个嵌入式表单,当我将不正确的数据放入 Address 类的表单字段中时,它会正确地级联错误。

但是,如果我将类 Address 的所有表单字段留空,则不会显示错误。看来没问题。除了 address 属性上的 Valid() 之外,我还需要指定 NotBlank()NotNull 。这是完整的示例:

// src/AppBundle/Entity/Address.php
namespace AppBundle\Entity;

use Symfony\Component\Validator\Constraints as Assert;

class Address
{
    /**
     * @Assert\NotBlank()
     */
    protected $street;

    /**
     * @Assert\NotBlank
     * @Assert\Length(max = 5)
     */
    protected $zipCode;
}

// src/AppBundle/Entity/Author.php
namespace AppBundle\Entity;

use Symfony\Component\Validator\Constraints as Assert;

class Author
{
    /**
     * @Assert\NotBlank()
     * @Assert\Length(min = 4)
     */
    protected $firstName;

    /**
     * @Assert\NotBlank()
     */
    protected $lastName;

    /**
     * @Assert\NotNull()
     * @Assert\Valid()
     */
    protected $address;
}

使用此代码,将address 的所有字段留空会使表单提交无效。这就是我想要的。

但是:提交后表单上不会显示任何错误消息。我认为这与 NotNull() 的错误消息未与单个表单字段关联这一事实有关。如何显示错误?

表单类型代码:

// src/AppBundle/Form/Type/AddressType.php
namespace AppBundle\Form\Type;

use AppBundle\Entity\Address;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\Extension\Core\Type\TextType;

class AddressType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('street', TextType::class)
                ->add('zipCode', TextType::class)
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => Address::class,
        ));
    }
}

// src/AppBundle/Form/Type/AuthorType.php
namespace AppBundle\Form\Type;

use AppBundle\Form\Type\AddressType;
use AppBundle\Entity\Author;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\Extension\Core\Type\TextType;

class AddressType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('firstName', TextType::class)
                ->add('lastName', TextType::class)
                ->add('address', AddressType::class)
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => Author::class,
        ));
    }
}

dump($form->getErrors(true,true)); 的输出:

AuthorController.php on line 33:
FormErrorIterator {#538 ▼
  -form: Form {#363 ▶}
  -errors: array:1 [▼
    0 => FormError {#748 ▼
      -message: "This value should not be null."
      #messageTemplate: "This value should not be null."
      #messageParameters: array:1 [▼
        "{{ value }}" => "null"
      ]
      #messagePluralization: null
      -cause: ConstraintViolation {#682 ▼
        -message: "This value should not be null."
        -messageTemplate: "This value should not be null."
        -parameters: array:1 [▶]
        -plural: null
        -root: Form {#363}
        -propertyPath: "data.author.address"
        -invalidValue: null
        -constraint: NotNull {#674 ▶}
        -code: "ad32d13f-c3d4-423b-909a-857b961eb720"
        -cause: null
      }
      -origin: Form {#489 ▶}
    }
  ]
}

最佳答案

在您的 Controller 中,您需要创建相关对象的实例。这样该对象不为空,您可以对其进行字段验证

public function myAction() 
{
  $formObject = new Author();
  $formObject->setAddress(new Address())

  $this->createForm(AuthorType::class, $formObject)

关于forms - 交响乐团 3 : Error message of embedded form with contraint on class property,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44847589/

相关文章:

javascript - 验证后 Angular 表单重置

validation - Vaadin 如何更改默认验证功能

ruby-on-rails - 如何验证 Rails 模型中的两个值不相等?

c# - 通过在 ASP.NET C# 中关闭 View 状态来清理 URL

ruby-on-rails - 以嵌套形式部分访问变量时出现问题

symfony - Doctrine 连接错误 "Undefined index: product in ObjectHydrator.php"(Symfony2)

mysql - 为什么 Easyadmin 不考虑多对多关系中的约束

node.js - 一个 JavaScript 框架,包括服务器端和客户端,用于描述表单并验证它们?

Javascript如何在html表单提交中使用多个函数来验证

php - Symfony SQLSTATE[HY000] [2002] 1and1 服务器拒绝连接