如果一个类具有另一个类的属性,则可以使用 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/