проверка Размер файла ограничение от значения в файле конфигурации

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

/**
* @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

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

Заранее спасибо .

0

Решение

Вот решение:

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

//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;

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

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector