Как использовать Assert \ File и Assert \ Image одновременно в Symfony? - PullRequest
2 голосов
/ 12 июня 2019

Я пытаюсь проверить загрузку файла с двумя условиями:

  1. Разрешено загружать только файл изображения или файл PDF

  2. Максимальная ширина с файлом изображения составляет 160px, а для файла PDF требования не требуются

Я использовал «Ограничения» Symfony, но когда я загружал файл PDF, он сказал, что

Этот файл не является допустимым изображением.

Поскольку я использовал одновременно Assert \ Image и Assert \ File, поэтому он проверит, является ли файл изображением илине первый.

Но Я хочу , чтобы при загрузке файла он сначала проверял Assert \ File.Если это изображение, то оно проверит Assert \ Image.Как я могу это сделать?

Вот мой код в Entity:

   /**
     * @Vich\UploadableField(mapping="ad", fileNameProperty="imageFile")
     * @var File
     * @Assert\File(
     *     mimeTypes = {"application/pdf", "application/x-pdf", "image/png", "image/jpeg", "image/svg+xml"},
     *     mimeTypesMessage = "You can only be allowed to upload Image file or PDF file"
     * )
     * @Assert\Image(
     *     maxWidth = 160
     * )
     */
    private $image;

Ответы [ 2 ]

1 голос
/ 12 июня 2019

Что вы можете сделать, это создать ограничение Custom Validation и проверить там тип файла или изображения с вашей собственной логикой.

https://symfony.com/doc/current/validation/custom_constraint.html

0 голосов
/ 12 июня 2019

Другим подходом может быть проверка этого в форме-событии

use Symfony\Component\Validator\ConstraintViolation;
use Symfony\Component\Validator\Validator\ValidatorInterface;
use Symfony\Component\Validator\Constraints as Assert;

private $validator;

public function __construct(ValidatorInterface $validator)
{
    $this->validator = $validator;
}

public function buildForm(FormBuilderInterface $builder, array $options)
{
    // Add the fields

    $builder->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event) {
        $data = $event->getData();

        if (// check mimetype of $data['image'] is an image) {
            $imageConstraint = new Assert\Image(['maxWidth' => 160]);

            $errors = $this->validator->validate($data['image'], $imageConstraint);

            if ($errors) {
                /** @var ConstraintViolation $error */
                foreach ($errors as $error) {
                    $event->getForm()->get('image')->addError(new FormError($error->getMessage()));
                }
            }
        }
    });
}
...