我已经通过使用验证组解决了相同的问题。
首先,
这很重要:在您的
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]);