Формы Symfony 2 с группами проверки, ошибки сопоставлены с неправильным свойством?

Никогда не было этой проблемы раньше.

  • Заполните форму с телефоном, оставив фамилию пустой
  • Отправьте форму (и группы проверки станут Default и Create)
  • Ошибка «Требуется фамилия». сопоставляется с неправильным полем $phone, в то время как должно быть сопоставлено с самим свойством $lastName

ошибка

Можете ли вы воспроизвести ту же проблему?

Свойство $phone находится в группе проверки Create, а $phone в неявной группе Default:

class User
{
    /**
     * @Assert\NotBlank(groups={"Create"}, message="Last name is required.")
     *
     * @var string
     */
    protected $lastName;

    /**
     * @Assert\NotBlank(message="Phone is required.")
     *
     * @var string
     */
    protected $phone;
}

Я определяю группы проверки на основе представленных данных:

class UserType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('lastName', 'text');
        $builder->add('phone', 'text');
        $builder->add('submit', 'submit');
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults([
            'required' => false,
            'data_class' => 'Acme\HelloBundle\Entity\User',
            'validation_groups' => function (FormInterface $form) {    
                return null === $form->getData()->getId()
                    ? ['Default', 'Create']
                    : ['Default', 'Edit'];
            }
        ]);
    }
}

person gremo    schedule 10.06.2014    source источник


Ответы (2)


Вместо использования прохода компилятора вы можете отредактировать config.yml, чтобы установить для API значение 2.4:

validation:
    enable_annotations: true
    api: 2.4 # default is auto which sets API 2.5 BC

Когда ошибка будет устранена в версии 2.5, просто удалите настройку API, и вы вернетесь к версии 2.5 с обратной совместимостью.

person OwlyCode    schedule 11.06.2014
comment
Я думаю, что это лучший ответ на вопрос, так как у вас больше контроля, пока API 2.5 не будет исправлен. У меня тоже была эта ошибка, и я искал, что я сделал не так, так как это была действительно странная ошибка! - person Jimmy Knoot; 22.07.2014

Предупреждение о наличии ошибки в API проверки 2.5.

Потратил пару часов, но нашел! На самом деле это проблема (https://github.com/symfony/symfony/issues/11003) для нового API валидатора 2.5.

Временное решение (проход компилятора):

use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\Validator\Validation;

class SetValidatorBuilderApiVersionWorkaround implements CompilerPassInterface
{
    /**
     * {@inheritDoc}
     */
    public function process(ContainerBuilder $container)
    {
        // TODO remove when https://github.com/symfony/symfony/issues/11003
        // is fixed (validation errors added to the wrong field)
        $container->getDefinition('validator.builder')
            ->addMethodCall('setApiVersion', [Validation::API_VERSION_2_4]);
    }
}
person gremo    schedule 10.06.2014