установить допустимое ограничение для встроенного объекта, только если установлен флаг в свойстве встроенного объекта

Я использую Symfony3.4.
Теперь у меня есть форма, представленная классом данных, который использует несколько дочерних объектов в качестве свойства:

contact {
protected $address;
protected $user;
protected $message;
}

Адресный объект включает в себя поле «address-> validate», которое может быть установлено пользователем во внешнем интерфейсе. Теперь требуется, чтобы этот адрес проверялся только в том случае, если пользователь проверяет поле «address-> validatable».

address {
private $street;
//[...]
private $validatable; //bool

public function isValidatable(){...}
}

Обычно я бы использовал callback-ограничение для проверки поля. Но поскольку функция обратного вызова является статической, во всех примерах показаны только обратные вызовы с одним единственным свойством field, и ExecutionContextInterface не позволяет мне добавлять ограничения впоследствии, я не знаю, как это реализовать.

Кто-нибудь может сказать мне, как решить это дело?

РЕДАКТИРОВАТЬ:
Благодаря Марку я решил это так:
У меня есть класс типа формы под названием «ContactGeneralType». В этом классе я добавляю группу, как описано на https://symfony.com/doc/3.4/form/data_based_validation.html:

    /**
* @param OptionsResolver $resolver
*/
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults($this->addDefaults([
'data_class' => ContactGeneral::class,
'cascade_validation' => true,
]));

$resolver->setDefaults([
'validation_groups' => function (FormInterface $form) {
$data = $form->getData();
if ($data->getAddress()->isValidatable()) {
return ['User', 'Address'];
} else {
return ['User'];
}
},
]);
}

Это делает все дело. Если у вас есть больше групп проверки адреса (например, если вы проверяете разные страны), вы уже можете внедрить свою службу в классе типа формы и также динамически установить имя группы:

            if ($data->getAddress()->isValidatable()) {
return ['User', $this->locationManager>getGroupName()];
}

0

Решение

Вместо использования обратного вызова, попробуйте создать собственный валидатор, который объясняется здесь: https://symfony.com/doc/current/validation/custom_constraint.html. Вы получаете свой Объект внутри валидатора, и вы можете проверить, проверено ли поле или нет, и проверить на основании этого.

РЕДАКТИРОВАТЬ:

Может быть, изменение группы проверки при отправке формы — лучшее решение, как описано здесь https://symfony.com/doc/current/form/data_based_validation.html

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector