Я решил эту же проблему, используя группы проверки.
Во-первых, это важно: использовать опцию validation_groups
в вашем AddressType
, чтобы установить группы проверки каждого ограничения каждого поля в типе:
<?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'
]);
Затем определите, что вы определяете ваши группы проверки по looki ng при значении флажка.
if ($request->request->get('sameAsShipping')) {
$checkoutValidationGroups = ['Default', 'billingAddress'];
} else {
$checkoutValidationGroups = ['Default', 'billingAddress', 'shippingAddress'];
}
Вы можете подтвердить только либо billingAddress
или shippingAddress
, или как с помощью механизма групп проверки.
Я решил использовать кнопку:
$formBuilder->add('submitButton', 'submit', ['validation_groups' => $checkoutValidationGroups]);