Zend_File_Transfer可以处理同一类的两个不同的过滤器吗?

时间:2012-01-18 21:51:13

标签: zend-framework

简短问题

Zend_File_Filter似乎将添加的过滤器重新映射到类名(字符串),然后从内部数组中调用它们。是否仍然可以将具有不同参数两次的相同过滤器类添加到Zend_File_Transfer?如果是,怎么样?

说明和测试环境

我正在使用Zend_File_Transfer上传图片。现在我想添加两个自己的过滤器来调整图像大小并将它们保存到某个位置(基本上是缩略图)。只要我只添加一次(一个缩略图大小),它就完美无缺。

但是当我想要添加两次时,Zend_File_Transfer似乎忘记了第一个实例,只是将其替换为第二个实例。

我使用的代码如下所示:

$uploadPhotoForm->getElement('photo')->addFilter('Rename', array(
    'target' => $article->getUrl() . '.' . $extension,
    'overwrite' => true
));

$uploadPhotoForm->getElement('photo')->addFilter(new Skoch_Filter_File_Resize(array(
    // no directory given means: use the default directory
    'width' => 600,
    'height' => 300,
    'keepRatio' => true,
)));

$uploadPhotoForm->getElement('photo')->addFilter(new Skoch_Filter_File_Resize(array(
    'directory' => '/default/path/thumbnail',
    'width' => 300,
    'height' => 100,
    'keepRatio' => true,
)));

我的实例是正确创建的(我调试了构造)。然而,调试filter()的实际调用会导致以下结果:

call to Skoch_Filter_File_Resize::filter()
array(5) { [0]=> int(300) [1]=> int(100) [2]=> bool(true) 
[3]=> string(79) "/some/long/default/path/thumbnail..." [4]=> bool(true) }

call to Skoch_Filter_File_Resize::filter()
array(5) { [0]=> int(300) [1]=> int(100) [2]=> bool(true) 
[3]=> string(79) "/some/long/default/path/thumbnail..." [4]=> bool(true) }

因此,您可以看到两个实例完全相同,即使我为600x300添加了一个实例,而为300x100像素添加了一个实例。

尝试在Zend_File_Transfer_Abstract中调试我的实例我发现,它似乎在_filter()中使用字符串用于类名:

foreach ($content['filters'] as $class) {
    // Comment by the author: $class is a string of my classname, checked with var_dump
    $filter = $this->_filters[$class];
        try {
            $result = $filter->filter($this->getFileName($name));

            $this->_files[$name]['destination'] = dirname($result);
            $this->_files[$name]['name']        = basename($result);
        } catch (Zend_Filter_Exception $e) {
            $this->_messages += array($e->getMessage());
    }
}

Zend_File_Transfer是否真的无法处理同一类的多个实例?我可以以某种方式别名过滤器,以便它们是唯一的吗?

1 个答案:

答案 0 :(得分:1)

您是否尝试构建过滤器链?这样每个过滤器都按顺序应用 Zend Framework Filter chains