2016-12-21 8 views
0

Я новичок в рамке Zend. Я использую настраиваемые валидаторы для проверки файла изображения, но я получаю эту ошибку.Пользовательский валидатор в zend framework 2

Zend\Validator\ValidatorPluginManager::get was unable to fetch or create an instance for ImageValidator 

Вот файл проверки:

namespace User\Validator; 

//use User\Validator\FileValidatorInterface; 
use Zend\Validator\File\Extension; 
use Zend\File\Transfer\Adapter\Http; 
use Zend\Validator\File\FilesSize; 
use Zend\Filter\File\Rename; 
use Zend\Validator\File\MimeType; 
use Zend\Validator\AbstractValidator; 

class ImageValidator extends AbstractValidator 
{ 
    const FILE_EXTENSION_ERROR = 'invalidFileExtention'; 
    const FILE_NAME_ERROR  = 'invalidFileName'; 
    const FILE_INVALID   = 'invalidFile'; 
    const FALSE_EXTENSION  = 'fileExtensionFalse'; 
    const NOT_FOUND    = 'fileExtensionNotFound'; 
    const TOO_BIG    = 'fileFilesSizeTooBig'; 
    const TOO_SMALL    = 'fileFilesSizeTooSmall'; 
    const NOT_READABLE   = 'fileFilesSizeNotReadable'; 

    public $minSize = 64;    //KB 
    public $maxSize = 1024;    //KB 
    public $overwrite = true; 
    public $newFileName = null; 
    public $uploadPath = './data/'; 
    public $extensions = array('jpg', 'png', 'gif', 'jpeg'); 
    public $mimeTypes = array(
      'image/gif', 
      'image/jpg', 
      'image/png', 
    ); 

    protected $messageTemplates = array( 
      self::FILE_EXTENSION_ERROR => "File extension is not correct", 
      self::FILE_NAME_ERROR  => "File name is not correct", 
      self::FILE_INVALID   => "File is not valid", 
      self::FALSE_EXTENSION  => "File has an incorrect extension", 
      self::NOT_FOUND    => "File is not readable or does not exist", 
      self::TOO_BIG    => "All files in sum should have a maximum size of '%max%' but '%size%' were detected", 
      self::TOO_SMALL    => "All files in sum should have a minimum size of '%min%' but '%size%' were detected", 
      self::NOT_READABLE   => "One or more files can not be read", 
    ); 

    protected $fileAdapter; 

    protected $validators; 

    protected $filters; 

    public function __construct($options) 
    { 
     $this->fileAdapter = new Http(); 
     parent::__construct($options); 
    } 

    public function isValid($fileInput) 
    { 
     //validation code 
    } 

} 

и здесь форма файла:

namespace User\Form; 

use Zend\Form\Form; 
use Zend\InputFilter\InputFilter; 
use Zend\Session\Container; 
use User\Validator\ImageValidator; 

class PlatFormForm extends Form 
{ 
    public function __construct() 
    { 
     parent::__construct('platform-form'); 
     $this->addInputFilter(); 
     $this->setAttribute('method', 'post'); 
     $this->setAttribute('enctype','multipart/form-data'); 
     $this->setAttribute('class', 'platform_popup'); 

     $this->addElements(); 
    } 

    private function addElements() 
    { 
     $this->add([ 
       'type' => 'file', 
       'name' => 'input_thumb', 
       'attributes' => [     
        'id' => 'input_thumb', 'class' => 'upload' 
       ]    
      ]); 

     $this->add([ 
       'type' => 'submit', 
       'name' => 'submit', 
       'attributes' => [     
        'id' => 'add_platform', 'class' => 'upload' 
       ], 
       'options' => [ 
        'label' => 'CREATE', 
        //'label_attributes' => [ 

        //], 
       ],    
      ]); 
    } 

    private function addInputFilter() 
    { 
     $inputFilter = new InputFilter();   
     $this->setInputFilter($inputFilter); 

     $inputFilter->add([ 
      'name'  => 'input_thumb', 
      'required' => true, 
      'filters' => [ 
       ['name' => 'StringTrim'], 
       ['name' => 'StripTags'], 
      ],     
      'validators' => [ 
       [ 
       'name' => 'ImageValidator', 
        'options' => [ 
        'minSize' => '64', 
        'maxSize' => '1024', 
        'newFileName' => 'newFileName2', 
        'uploadPath' => './data/' 
        ], 
       ],    
      ], 
      ] 
     );  


    } 
} 

и вот module.config.php код файла:

'validators' => array(
     'invokables' => array(
      'ImageValidator' => 'User\Validator\ImageValidator' 
     ), 
    ), 

Может ли кто-нибудь предложить мне, что я делаю неправильно?

ответ

0

Чтобы придать параметры валидатора в ваш метод конструктора, вы должны зарегистрировать свой валидатор, как это внутри module.config.php файла:

<?php 
use Zend\ServiceManager\Factory\InvokableFactory; 
use User\Validator\ImageValidator; 

return array(

    //... 

    'validators' => array(
     'factories' => array(
      ImageValidator::class => InvokableFactory::class 
     ), 
     'aliases' => array(
      'ImageValidator' => ImageValidator::class 
     ) 
    ), 

    //... 

); 
+0

:) Спасибо за ответ. Можете ли вы предложить мне, как получить новое имя загруженного файла в действии контроллера? Я использую правило проверки, как .. 'валидаторы' => [ \t \t \t [ \t \t \t \t 'имя' => '\ User \ Validator \ ImageValidator', \t \t \t \t 'опции' => [ \t \t \t \t \t 'MinSize' => '1', \t \t \t \t \t 'MaxSize' => '1 024', \t \t \t \t \t 'newFileName' => time(). 'newFileName2', \t \t \t \t \t 'uploadPath' => getcwd(). '/ Государственные/загрузки/Платформа /' \t \t \t \t], \t \t \t], \t \t \t \t \t \t], и он работает правильно, но я понятия не имею, к тому, как получить имя файла или ошибки в действия контроллера. – anil

+0

@anil Добро пожаловать. Это следует рассматривать как новый вопрос. Я предлагаю вам принять мой ответ и задать новый вопрос в StackOverflow, если вы не можете найти существующий, который имеет дело с этой проблемой переименования. Вы также можете проверить документы, на которые я ссылаюсь в другом связанном ответе [здесь] (http: // stackoverflow.com/a/37469717/1697459). – Wilt

0

На самом деле, я столкнулся с той же проблемой, и в первую очередь вам не нужно впрыскивать что угодно (если вы этого не хотите). Просто добавив полный путь к считывающему будет работать, в вашем примере:

private function addInputFilter() 
    { 
     $inputFilter = new InputFilter();   
     $this->setInputFilter($inputFilter); 

     $inputFilter->add([ 
      'name'  => 'input_thumb', 
      'required' => true, 
      'filters' => [ 
       ['name' => 'StringTrim'], 
       ['name' => 'StripTags'], 
      ],     
      'validators' => [ 
       [ 
       'name' =>'User\Validator\ImageValidator\ImageValidator', 
        'options' => [ 
        'minSize' => '64', 
        'maxSize' => '1024', 
        'newFileName' => 'newFileName2', 
        'uploadPath' => './data/' 
        ], 
       ],    
      ], 
      ] 
     );  
    } 

Но я хотел бы отметить, что это не правильный способ загрузки файлов, независимо от того, что они являются изображениями или нет. Вместо этого вы должны использовать FileInput().

Простой пример можно найти здесь: https://framework.zend.com/manual/2.4/en/modules/zend.input-filter.file-input.html