我已经通过使用验证组解决了同样的问题。
首先,这很重要:使用AddressType 中的validation_groups 选项在类型中设置每个字段的每个约束 的验证组:
<?php
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Form\FormBuilderInterface;
class AddressType extends \Symfony\Component\Form\AbstractType
{
function buildForm(FormBuilderInterface $builder, array $options)
{
$groups = $options['validation_groups'];
$builder->add('firstName', 'text', ['constraints' => new Assert\NotBlank(['groups' => $groups])]);
$builder->add('lastName', 'text', ['constraints' => new Assert\NotBlank(['groups' => $groups])]);
}
}
然后,在父表单中将不同的验证组传递给两个字段:
<?php
$formBuilder = $this->get('form.factory')
->createNamedBuilder('checkout', 'form', null, [
'cascade_validation' => true,
])
->add('billingAddress', 'address', [
'validation_groups' => 'billingAddress'
])
->add('shippingAddress', 'address', [
'validation_groups' => 'shippingAddress'
]);
然后,通过查看复选框的值来确定您的验证组。
if ($request->request->get('sameAsShipping')) {
$checkoutValidationGroups = ['Default', 'billingAddress'];
} else {
$checkoutValidationGroups = ['Default', 'billingAddress', 'shippingAddress'];
}
然后,您可以使用验证组机制仅验证 billingAddress 或 shippingAddress,或同时验证两者。
我选择使用按钮:
$formBuilder->add('submitButton', 'submit', ['validation_groups' => $checkoutValidationGroups]);