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 解码器。我在代码的其他部分使用Symfonys YAML 组件来完成此任务。

所以我要问你的问题是如何将这个解码器注入工厂?或者,如果有其他方法可以做到这一点,那么还有什么办法可以解决呢?

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 回答