Symfony2 Проверка поля выбора не работает

У меня есть форма в Symfony 2.7.10, определение которой выглядит так:

<?php

// ...

class RecipeType extends AbstractType
{
// ...

/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
// ...
->add('meal_schema', 'choice', [
'label'   => 'Mealtime schema',
'choices' => [
'breakfast'        => 'Breakfast',
'second_breakfast' => 'Second breakfast',
'lunch'            => 'Lunch',
'dinner'           => 'Dinner',
'snack'            => 'Snack',
'supper'           => 'Supper',
],
'multiple' => true,
'expanded' => true,
'label_attr' => ['class' => 'col-md-2'],
'required' => true,
])
}

// ...
}

Вот как выглядит валидация в файле validation.yml:

My\Real\Namespace\Entity\Recipe:
properties:
name:
- NotBlank: ~
mealSchema:
# Look below

Проверка поля имени работает, а проверка foodSchema — нет.
Настройки, которые я уже пробовал безуспешно:

# This one works but assigns error to form instead of field so it's displayed on top of the page
- NotBlank:
message: Mealtime schema should not be blank

# This doesn't work
- Choice:
callback: [RecipeMealSchemaChoices, getChoiceKeys] # This method isn't even called
min: 1
minMessage: "Please select meal schema"
# This also doesn't work
- Count:
min: 1
max: 99
minMessage: Mealtime schema should not be blank
maxMessage: Max meal time exceeded

1

Решение

Хорошо, я решил это.

Моя ошибка заключалась в том, чтобы не предоставлять информацию о mealSchema поле в моей сущности при запросе на stackoverflow. Если бы я сделал это, то понял бы, что поле сущности на самом деле smallint.

Мой коллега хотел эмулировать тип поля MySQL «SET» в Doctrine, поэтому он использовал массив в качестве значений точки входа и преобразовал его в битовые значения в методе setter (и наоборот в методе getter).

Вот почему ни одно из правил проверки, связанных с выбором, не сработало. На данный момент я сделал 2 быстрых решения:

  1. Измените имена всех полей в RecipeType с подчеркивания на camelCase, потому что именно так они названы в нашей сущности. Это помогло для ошибки, прикрепленной к форме вместо поля.

  2. Используется NotNull валидатор, потому что значение по умолчанию mealSchema было null, а не пустой массив.

1

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

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

По вопросам рекламы [email protected]