Подтвердить что ты не робот

Не пустое поле ввода файла в форме Symfony2

В моей сущности Doctrine, которая data_class для моей формы, у меня есть свойство файла, определенное следующим образом:

/**
     * Image.
     *
     * @Assert\NotBlank
     * @Assert\File
     * @Assert\Image(minWidth="138", minHeight="96")
     */
    protected $file;

Кроме того, добавьте его для формирования типа с помощью ->add('file', 'file')...

Создание объекта работает отлично, но проблема заключается в том, когда я использую форму для обновления этого объекта. Он запрашивает файл снова, так как он имеет @Assert\NotBlank. Поскольку у меня есть другие поля в этой форме, я не хочу повторно загружать изображение при каждом обновлении.

Когда я удаляю @Assert\NotBlank, everithing отлично работает, но я хочу, чтобы это поле файла было обязательным.

Любая идея?

4b9b3361

Ответ 1

У вас есть два выхода из этой ситуации, и оба полагаются на валидаторы Callback: (обратный вызов Symfony)

Либо добавьте boolean с именем isUpdate к объекту, который не будет сохранен, и сообщит валидатору, какая операция была предпринята. Этот метод полностью описан в ссылке выше.

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

if ( $this->isUpdate == false ){
    $builder->addValidator(new CallbackValidator(function(FormInterface $form){
        if ( $form['image_file']->getData() == NULL ){
            $form->addError(new FormError('You need to specify image file.'));                  
        }
    }));
}

Может быть, есть более простой способ добиться желаемой проверки, но я столкнулся с этими двумя месяцами назад.

Надеюсь, что это поможет...

Ответ 2

Для этого также можно использовать группы валидации. Одна группа проверки (возможно, по умолчанию одна) будет для создания и вторая для обновления.