如何在Symfony中同时使用Assert \ File和Assert \ Image?

时间:2019-06-12 03:18:37

标签: symfony sonata-admin

我正在尝试通过两种条件验证文件上传:

  
      
  1. 仅允许上传图像文件或PDF文件

  2.   
  3. 图像文件的最大宽度为160px,PDF文件不需要宽度

  4.   

我使用了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 个答案:

答案 0 :(得分:1)

您可以做的是创建“自定义验证”约束,并使用自定义逻辑在此处检查文件或图像的类型。

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

答案 1 :(得分:0)

另一种方法可能是在表单事件中进行检查

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()));
                }
            }
        }
    });
}