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