ValidatorPluginManager无法在模型输入过滤器中完成其工作

时间:2016-10-06 12:42:45

标签: php validation zend-framework zend-framework2 zend-form

我对抽象验证器有疑问。我正在尝试实施Mb Rostami found here的解决方案。

这是我得到的错误:

  

Zend \ Validator \ ValidatorPluginManager :: get无法为Application \ Validators \ File \ Image

获取或创建实例

我想要做的就是以某种方式将类注入模型中。什么是Application\Validators\File\Image

那么如何修复此错误?最简单的解决方案是将验证器类添加为模块的可调用对象吗?

模型类中的输入过滤器:

public function getInputFilter()
{
    if (!$this->inputFilter) {
        $inputFilter = new InputFilter();

        $inputFilter->add(array(
            'name' => 'eid',
            'required' => true,
            'filters' => array(
                array('name' => 'Int'),
            )
        ));

        $newFileName = sha1(time(), true);
        $inputFilter->add(
            array(
                'name' => 'ImageValidator',
                'required' => true,
                'validators' => array(
                    array(
                        'name' => '\Application\Validators\File\Image',
                        'options' => array(
                            'minSize' => '64',
                            'maxSize' => '5120',
                            'newFileName' => $newFileName,
                            'uploadPath' => './data/'
                        ),
                    ),

                )
            )
        );

        $this->inputFilter = $inputFilter;
    }

    return $this->inputFilter;
}

验证员类:

<?php

namespace Application\Validators\File;

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 Image 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)
{
    $options = $this->getOptions();
    $extensions = $this->extensions;
    $minSize = $this->minSize;
    $maxSize = $this->maxSize;
    $newFileName = $this->newFileName;
    $uploadPath = $this->uploadPath;
    $overwrite = $this->overwrite;
    if (array_key_exists('extensions', $options)) {
        $extensions = $options['extensions'];
    }
    if (array_key_exists('minSize', $options)) {
        $minSize = $options['minSize'];
    }
    if (array_key_exists('maxSize', $options)) {
        $maxSize = $options['maxSize'];
    }
    if (array_key_exists('newFileName', $options)) {
        $newFileName = $options['newFileName'];
    }
    if (array_key_exists('uploadPath', $options)) {
        $uploadPath = $options['uploadPath'];
    }
    if (array_key_exists('overwrite', $options)) {
        $overwrite = $options['overwrite'];
    }
    $fileName = $fileInput['name'];
    $fileSizeOptions = null;
    if ($minSize) {
        $fileSizeOptions['min'] = $minSize * 1024;
    }
    if ($maxSize) {
        $fileSizeOptions['max'] = $maxSize * 1024;
    }
    if ($fileSizeOptions) {
        $this->validators[] = new FilesSize($fileSizeOptions);
    }
    $this->validators[] = new Extension(array('extension' => $extensions));
    if (!preg_match('/^[a-z0-9-_]+[a-z0-9-_\.]+$/i', $fileName)) {
        $this->error(self::FILE_NAME_ERROR);
        return false;
    }

    $extension = pathinfo($fileName, PATHINFO_EXTENSION);
    if (!in_array($extension, $extensions)) {
        $this->error(self::FILE_EXTENSION_ERROR);
        return false;
    }
    if ($newFileName) {
        $destination = $newFileName . ".$extension";
        if (!preg_match('/^[a-z0-9-_]+[a-z0-9-_\.]+$/i', $destination)) {
            $this->error(self::FILE_NAME_ERROR);
            return false;
        }
    } else {
        $destination = $fileName;
    }
    $renameOptions['target'] = $uploadPath . $destination;
    $renameOptions['overwrite'] = $overwrite;
    $this->filters[] = new Rename($renameOptions);
    $this->fileAdapter->setFilters($this->filters);
    $this->fileAdapter->setValidators($this->validators);
    if ($this->fileAdapter->isValid()) {
        $this->fileAdapter->receive();
        return true;
    } else {
        $messages = $this->fileAdapter->getMessages();
        if ($messages) {
            $this->setMessages($messages);
            foreach ($messages as $key => $value) {
                $this->error($key);
            }
        } else {
            $this->error(self::FILE_INVALID);
        }
        return false;
    }
}
}

1 个答案:

答案 0 :(得分:0)

解决方案很简单,至少在我的情况下。就像我上面提到的:检查文件夹结构。 Zend Framework有自己构建项目文件的方式,因此文件路径需要匹配。