1

YAML形式の設定ファイルを使用してホールアプリケーションをセットアップしました。application.configファイルのmodule_listener_optionsのグローバルパスに関しては、次のスタックトレースですべての楽しみを終了します。

アプリケーション構成

modules:
- # ... a few different modules

module_listener_options:
  config_glob_paths:
  - config/global/{,*.}{shared,private}.yaml

  module_paths:
  - # ... the module paths

スタックトレース

Fatal error:  Uncaught exception 'Zend\Config\Exception\RuntimeException' with message 'You didn't specify a Yaml callback decoder' in /home/erik/Projects/zf2/vendor/zendframework/zendframework/library/Zend/Config/Reader/Yaml.php:100
Stack trace:
#0 /home/erik/Projects/zf2/vendor/zendframework/zendframework/library/Zend/Config/Factory.php(81): Zend\Config\Reader\Yaml->fromFile('config/global/d...')
#1 /home/erik/Projects/zf2/vendor/zendframework/zendframework/library/Zend/ModuleManager/Listener/ConfigListener.php(356): Zend\Config\Factory::fromFile('config/global/d...')
#2 /home/erik/Projects/zf2/vendor/zendframework/zendframework/library/Zend/ModuleManager/Listener/ConfigListener.php(152): Zend\ModuleManager\Listener\ConfigListener->addConfigByPath('config/global/{...', 'glob_path')
#3 [internal function]: Zend\ModuleManager\Listener\ConfigListener->onLoadModulesPost(Object(Zend\ModuleManager\ModuleEvent))
#4 /home/erik/Projects/zf2/vendor/zendframework/zendframework/library/Zend/EventManager/EventManager.php(464): call_u in /home/erik/Projects/zf2/vendor/zendframework/zendframework/library/Zend/Config/Reader/Yaml.php on line 100

YAMLリーダーにYAMLデコーダーを挿入する必要があると思います。コードの他の部分では、このタスクにSymfonysYAMLコンポーネントを使用しています。

だから私があなたに持っている質問は、どうやってこのデコーダーを工場に注入するのですか?または、これを行う他の方法がある場合、他にどのようにこれを解決できますか?

4

2 に答える 2

1

initそこで、Moduleクラスに次の関数を追加することでこれを解決できることがわかりました。

use Symfony\Component\Yaml\Parser as YamlParser,
    Zend\Config\Factory as ConfigFactory;

// ...

public function init()
{
  // This first line is just for the shorter yml suffix
  ConfigFactory::registerReader( 'yml', 'yaml' );

  // Adding the parser to the reader
  $decoder = new YamlParser();
  $reader  = ConfigFactory::getReaderPluginManager()->get( 'yaml' );
  $reader->setYamlDecoder( [ $decoder, 'parse' ] );
}

しかし、私はまだこれを解決する別の方法に非常に興味があります。

于 2013-01-05T01:05:42.930 に答える
0

ドキュメントでは、パーサーに外部ライブラリを使用しています

外部YAMLリーダーを使用する場合は、クラスのコンストラクターでコールバック関数を渡す必要があります。たとえば、Spycライブラリを使用する場合

// include the Spyc library
require_once ('path/to/spyc.php');

$reader = new Zend\Config\Reader\Yaml(array('Spyc','YAMLLoadString'));
$data   = $reader->fromFile('/path/to/config.yaml');

また、パラメーターなしでZend \ Config \ Reader \ Yamlをインスタンス化し、setYamlDecoder()メソッドを使用してYAMLリーダーをすぐに指定することもできます。

http://framework.zend.com/manual/2.0/en/modules/zend.config.reader.html

今のところ他のyamlパーサーを使用していないため、このソリューションで問題が解決しました

于 2013-04-03T12:42:37.667 に答える