Вот решение:
сначала давайте создадим значение конфигурации в файле параметров:
//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;
надеюсь, это поможет вам.