Filter ZF2:如何实现自定义过滤器?
我已经与Zend Framework 2合作了几个星期,尽管在线文档非常不完整,我还是设法建立了我的网站的初稿 不幸的是,我在尝试实现Zend\Filter\File\Rename Filter的自定义版本时遇到了问题;在这里,我总结了我所做的工作: 1) 在我的名为“Library”的模块中,创建了该文件 src\Library\Filter\File\Rename.phpFilter ZF2:如何实现自定义过滤器?,filter,zend-framework2,Filter,Zend Framework2,我已经与Zend Framework 2合作了几个星期,尽管在线文档非常不完整,我还是设法建立了我的网站的初稿 不幸的是,我在尝试实现Zend\Filter\File\Rename Filter的自定义版本时遇到了问题;在这里,我总结了我所做的工作: 1) 在我的名为“Library”的模块中,创建了该文件 src\Library\Filter\File\Rename.php namespace Library\Filter\File; use Traversable; use Zend\Fi
namespace Library\Filter\File;
use Traversable;
use Zend\Filter;
use Zend\Filter\Exception;
use Zend\Stdlib\ArrayUtils;
class Rename extends Filter\AbstractFilter {
static $uploadDir = '/srv/default/htdocs/public/uploads/';
public function filter($value) {
do {
$newname = md5(uniqid(time()));
} while(file_exists(self::uploadDir . $newname);
if (rename($value, self::uploadDir . $newname) !== true)
throw new Exception\RuntimeException(sprintf("File '%s' could not be renamed. An error occurred while processing the file.", $value));
return self::uploadDir . $newname;
}
}
正如你所看到的,这很简单。以下是模块配置:
module.config.php
<?php
return array(
'controllers' => array(
// Invokables don't support dependencies
'invokables' => array(
'myFileRename' => 'Library\Filter\File\Rename',
),
));
但这不起作用,因为我总是会遇到一个例外:
Fatal error: Uncaught exception 'Zend\ServiceManager\Exception\ServiceNotFoundException' with message 'Zend\ServiceManager\ServiceManager::get was unable to fetch or create an instance for myFileRename' in /srv/default/vendor/ZF2/library/Zend/ServiceManager/ServiceManager.php:420
Stack trace:
#0 /srv/default/vendor/ZF2/library/Zend/ServiceManager/AbstractPluginManager.php(108): Zend\ServiceManager\ServiceManager->get('myfilerename', true)
#1 /srv/default/vendor/ZF2/library/Zend/Filter/FilterChain.php(179): Zend\ServiceManager\AbstractPluginManager->get('myfilerename', NULL)
#2 /srv/default/vendor/ZF2/library/Zend/InputFilter/Factory.php(263): Zend\Filter\FilterChain->attachByName('myfilerename', Array)
#3 /srv/default/vendor/ZF2/library/Zend/InputFilter/Factory.php(171): Zend\InputFilter\Factory->populateFilters(Object(Zend\Filter\FilterChain), Array)
#4 /srv/default/vendor/ZF2/library/Zend/InputFilter/Factory.php(237): Zend\InputFilter\Factory->createInput(Array)
#5 /srv/default/vendor/ZF2/library/Zend/Form/Form.php(672) in /srv/default/vendor/ZF2/library/Zend/ServiceManager/ServiceManager.php on line 420
不幸的是,我在整个互联网上都没有找到帮助我解决这个问题的文章,即使将我的过滤器别名为工厂,我仍然会遇到这个错误:/I我必须做什么?您将过滤器作为控制器加载(因此,模块配置中的
控制器
键)。过滤器有一个插件管理器,但是对于这个过滤器,您不需要插件管理器。过滤器插件管理器中也没有MVC配置的链接
最简单的方法是自己实例化过滤器。它应该是这样的工作:
use Library\Filter\File\Rename as RenameFilter;
public function getInputFilterSpecification()
{
return array(
'file' => array(
'required' => false,
'filters' => array(
new RenameFilter,
),
)
);
}
只需使用:
'name' => 'file',
'required' => false,
'filters' => array(
array('name' => 'Library\Filter\File\Rename'),
),
有同样的问题。。。这是我的解决方案
'name' => 'file',
'required' => false,
'filters' => array(
array('name' => 'Library\Filter\File\Rename'),
),