5

私はZendFramework2を数週間使用しており、オンラインのドキュメントはかなり不完全ですが、Webサイトの最初のドラフトを作成することができました。

残念ながら、Zend \ Filter \ File\Renameフィルターのカスタムバージョンを実装しようとしたときに行き詰まりました。ここで私がしたことを要約します:

1)「ライブラリ」というモジュールで、ファイルを作成しました

src \ Library \ Filter \ File \ Rename.php

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',
            ),
    ));

フォームは次のとおりです。

[...]
    public function getInputFilterSpecification() {
        return array(
            'file' => array(
                'required'  => false,
                'filters'   => array(
                    // Custom Renamer
                    array('name' => 'myFileRename'),
                ),
            )
        );
    }
 }

?>

しかし、私は常に例外を取得するため、これは機能していません。

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

残念ながら、インターネット全体でこれを支援する記事は見つかりませんでした。フィルターをファクトリとしてエイリアシングした場合でも、このエラーが発生します:/どうすればよいですか?

4

2 に答える 2

2

フィルターをコントローラーであるかのようにロードします (したがって、controllerモジュール構成のキー)。フィルターにはプラグイン マネージャーがありますが、このフィルターにはプラグイン マネージャーは必要ありません。フィルター プラグイン マネージャーには、MVC 構成とのリンクもありません。

最も簡単な方法は、フィルターを自分でインスタンス化することです。動作するのは次のようなものである必要があります。

use Library\Filter\File\Rename as RenameFilter;

public function getInputFilterSpecification()
{
    return array(
        'file' => array(
            'required'  => false,
            'filters'   => array(
                new RenameFilter,
            ),
        )
    );
}
于 2012-11-23T13:21:04.387 に答える
0

ちょうど使用:

'name' => 'file',
'required' => false, 
'filters' => array(
     array('name' => 'Library\Filter\File\Rename'),
),

同じ問題がありました...これが私にとっての解決策でした...

于 2013-08-31T10:13:58.977 に答える