проверка Размер файла ограничение от значения в файле конфигурации - PullRequest
0 голосов
/ 19 декабря 2018

Я использую файл подтверждения по умолчанию:

/**
     * @Assert\NotBlank()
     * @Assert\File(
     *  mimeTypes={
     *          "application/pdf",
     *          "image/jpeg",
     *          "image/pjpeg",
     *          
     *  },
     *  mimeTypesMessage="The file format is not correct",
     *  maxSize="1M",
     * )

     * @var File $file
     */
    private $file;

Я проверяю, меньше ли размер файла, чем 1M.Но что, если я хочу создать конфигурацию в файле конфигурации, например:

//yml file
max_size_file : 1

и использовать значение в утверждении.

Я знаю, что необходимо создать пользовательскую проверку в качестве службы и внедрить контейнер для получения значения конфигурации из параметров или файла конфигурации. Это выглядит примерно так:

/**
  *
  *@Assert\myConstraint()
  */
private $file 

любая помощь, пожалуйста.

Спасибо заранее.

1 Ответ

0 голосов
/ 20 декабря 2018

Вот решение:

сначала давайте создадим значение конфигурации в файле параметров:

//parameters.yml

max_file_size_upload: 2 // the unit is MEGABYTE

значение единицы равно МБ, поэтому проверьте метку factorizeSize в FileSizeValidatorесли вы хотите настроить свою собственную логику

Чтобы реализовать собственный валидатор, Symfony предлагает вам создать класс для ограничения и другой класс для проверки ограничения, поэтому давайте сначала создадим класс ограничения:

<?php

namespace Acme\AppBundleBundle\Service\Validation;


use Symfony\Component\Validator\Constraint;

    /**
     * the Max file size upload constraint
     *
     * @Annotation
     * Class FileSize
     * @package Acme\AppBundle\Service\Validation

     */
    class FileSize extends Constraint
    {
        /**
         * @var string the message error if the file {{size}} uploaded is greater than {{limit}}
         *
         * {{size}} the file upload size
         * {{limit}} max_file_size_upload in the parameters.(env).yml
         *
         * in case of custom the error message, add the maxSizeMessage attribute the the assertion :
         * @example :
         *
         *           maxSizeMessage= "you custom message ({{ size }} ). you custom message  {{ limit }} ."
         *
         */
        public $maxSizeMessage = 'The file is too large ({{ size }} M). Allowed maximum size is {{ limit }} M.';


    }

класс валидатора ограничения:

<?php


namespace Acme\AppBundle\Service\Validation;


use Symfony\Component\HttpFoundation\File\UploadedFile;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
use Symfony\Component\Validator\Exception\UnexpectedTypeException;

    /** 
     *
     * Class FileSizeValidator
     * @package Acme\AppBundle\Service\Validation
     */
    class FileSizeValidator extends ConstraintValidator
    {

        const CONVERT_MB_TO_B = "MBTOB";
        const CONVERT_B_TO_MB = "BTOMB";


        private $_maxFileSizeUpload;


        public function __construct($maxFileSizeUpload)
        {
            $this->_maxFileSizeUpload = $maxFileSizeUpload;
        }

        /**
         * @param mixed $value
         * @param Constraint $constraint
         */
        public function validate($value, Constraint $constraint)
        {

            if (!$constraint instanceof FileSize) {

                throw new UnexpectedTypeException($constraint, __NAMESPACE__.'\FileSize');
            }

            if($value instanceof UploadedFile){

                if($this->_maxFileSizeUpload < $this->factorizeSize($value->getClientSize())){

                    $this->context->buildViolation($constraint->maxSizeMessage)
                        ->setParameter('{{ size }}', $this->factorizeSize($value->getClientSize(),self::CONVERT_B_TO_MB))
                        ->setParameter('{{ limit }}', $this->_maxFileSizeUpload)
                        ->addViolation();

                }

            }

            return;

        }


        /**
         * @param $size
         * @param string $convert
         * @return float|int
         */
        protected function factorizeSize($size,$convert =self::CONVERT_MB_TO_B){

            $size = intval($size);

            if($convert == self::CONVERT_MB_TO_B){

                return $size*pow(10,6);

            }
            else{

                return intval($size/pow(10,6));

            }


        }




    }

Валидатор должен быть объявлен как сервис для ввода значения параметра, поэтому нам нужно добавить его в service.yml:

  fileSizeValidator.service:
    class: Acme\AppBundle\Service\Validation\FileSizeValidator
    arguments: [%max_file_size_upload%]
    tags:
      - name: validator.constraint_validator
        alias: file_size_correct

Псевдоним: file_size_correct - это значение, которое ваш метод validateBy должен вернуть в классе FileSize, поскольку ваш Validator теперь является сервисом, если нет, то ваше ограничение не может найти класс Validator,см. официальный документ [здесь] [1]

[1]: https://symfony.com/doc/2.8/validation/custom_constraint.html#constraint-validators-with-dependencies

используйте ограничение:

   /**
     * @MyAssert\FileSize()
     *
     * @var File $file
     */
    protected $file;

надеюсь, это поможет вам.

...