У меня есть следующий тип формы:
class ProjectStep1Type extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('client', new ClientType(), [
'label' => 'Client',
]);
// More fields
// Save as draft button
$builder->add('saveDraft', 'submit', [
'label' => 'Save as draft',
]);
// Actual submit button
$builder->add('validate', 'submit', [
'label' => 'Validate',
]);
}
public function configureOptions(OptionsResolver $resolver)
{
$validationGroups = function(FormInterface $form) {
if ($form->get('saveDraft')->isClicked()) {
return ['Default', 'Draft'];
}
return ['Default', 'Step1'];
};
$resolver->setDefaults([
'data_class' => 'AppBundle\Entity\Project',
'validation_groups' => $validationGroups,
]);
}
}
Файл yaml для (частичной) проверки выглядит следующим образом:
AppBundle\Entity\Client:
group_sequence:
- Client
- TypesOK
properties:
label:
- NotNull:
groups: [Step1]
- Type: string
- Length:
max: 255
groups: [TypesOK]
vatCode:
- NotNull:
groups: [Step1]
- Type:
type: string
contact:
- NotNull: ~
- Type: AppBundle\Entity\Contact
- Valid: ~
address:
- Type: AppBundle\Entity\Address
- Valid: ~
sector:
- NotNull:
groups: [Step1]
- Type: AppBundle\Entity\CompanySector
AppBundle\Entity\Project:
group_sequence:
- Project
- TypesOK
properties:
client:
- NotNull:
message: form.project.client.error.not_null
- Type: AppBundle\Entity\Client
- Valid: ~
status:
- NotNull: ~
- Type: string
- Choice:
choices: [DRAFT_1, DRAFT_2, DRAFT_3, SENT, REJECTED, DELETED]
groups: [TypesOK]
Теперь к проблеме: когда я проверяю форму, Project
сущность правильно проверена, один раз для каждой группы в последовательности, т.е. [Project, TypesOK, Draft]
,
Client
субъект, однако, проверяется с использованием Default
группа проверки. Если проверка прошла успешно с Default
, группы Client
а также TypesOK
не называются.
Однако, если проверка не пройдена, эти группы называются! И сообщения об ошибках, которые я бы предпочел не показывать, отображаются вместе с ошибками, возникающими при проверке с помощью Default
,
Я ожидал, что Client
никогда не проверяется с помощью Default
, но это вместо этого Default
группа будет преобразована в последовательность группы [Client, TypesOK]
, даже если он проходит через Valid
ограничение.
Я что-то пропустил?
РЕДАКТИРОВАТЬ:
Я сделал некоторый прогресс по этому поводу. Проблема проверки у меня возникает только когда я редактирую форму. Когда я редактирую форму, прокси-класс наследует Client
используется вместо обычного Client
учебный класс.
Нормальная черта для Доктрины.
Однако фабрика метаданных валидатора не использует групповую последовательность родительского элемента. Client
, Он выбирает свои ограничения, но не это свойство.
Кажется, эта проблема довольно близка к этот другой вопрос однако разрешение там не работает для меня.
Теперь мне кажется, что проблема достаточно ясна, однако я понятия не имею, как мне решить эту проблему должным образом.
Первое, что я увидел, было то, что в вашей группе проверки AppBundle\Entity\Project
клиент определяется как ItalyBundle\Entity\Client
но в группе проверки для клиента AppBundle\Entity\Client
используется.
Других решений пока нет …