提问者:小点点

ZfcTwig没有加载配置,引导失败


嗨,我对ZF2比较陌生,所以这可能是我犯的一个非常简单的错误。

问题

当加载ZfcTwig模块时,我得到一个异常

致命错误:未捕获异常“Zend\ServiceManager\exception\ServiceNotFoundException”,消息为“Zend\ServiceManager\ServiceManager::get无法在/www/ZendFramework2/library/Zend/ServiceManager/ServiceManager中获取或创建Twig_环境的实例”。php在线555

此异常抛出在ZfcTwig\Module.phponBootstrap函数中:

<?php
class Module implements
  BootstrapListenerInterface,
  ConfigProviderInterface
{
  public function onBootstrap(EventInterface $e)
  { 
    /** @var \Zend\Mvc\MvcEvent $e*/
    $application    = $e->getApplication();
    $serviceManager = $application->getServiceManager();
    $environment    = $serviceManager->get('Twig_Environment'); // throws the exception
    //...
  }
  public function getConfig(){ return [/*...*/]; } // never called
}

我不明白的是,为什么在加载配置之前调用引导。'Twig_Environment'服务是在ZfcTwig模块的配置中配置的,但在调用onBootstrap时,该配置尚未加载。

ZF2加载器通过ZF2_路径环境变量。不使用作曲家自动加载器。

应用程序中。配置。php我为我的系统范围的可重用模块存储库设置了一个额外的模块路径'/global/vendor'。我没有使用项目本地供应商文件夹。

我正在从'/global/vendor/ZfcTwig'加载模块ZfcTwig(链接),以获得ZF2中的细枝模板引擎支持。

因为这依赖于细枝库,所以我将细枝库放入'/global/vendor/twig'

为了启用ZfcTwig模块和细枝库类的自动加载,我更改了该模块。通过实现AutoloaderProviderInterface并为twig和ZfcTwig添加配置,实现ZfcTwig的php。

<?php
class Module implements
    BootstrapListenerInterface,
    AutoloaderProviderInterface,
    ConfigProviderInterface
{
    /**
     * Autoloading the twig library and this modules classes
     * @return array
     */
    public function getAutoloaderConfig()
    {
        $pathToTwigLib = dirname(dirname(dirname(__DIR__))) . '/twig/twig/lib/Twig';
        return array(
            'Zend\Loader\StandardAutoloader' => array(
                'namespaces' => array(
                    __NAMESPACE__ => __DIR__,
                ),
                'prefixes' => array(
                    'Twig_' => $pathToTwigLib,
                ),
            ),
        );
    }

应用程序中。配置。php我正在加载模块['Application','twig','ZfcTwig']

twig的自动加载正在工作(至少我可以在ZfcTwig和其他控制器的引导中使用new实例化twig\u环境)。


共1个答案

匿名用户

问题就在我自己想知道的地方。在引导完成之前,需要加载配置。然而,这正是ZF2所做的,除非像我一样,您启用了配置缓存。

<?php
// config/applicaiton.config.php
return array(
  'module_listener_options' => array(
    // this prevents the call to getConfig on Modules
    // that implement the ConfigProviderInterface
    // default: false
    'config_cache_enabled' => true, 
  )
);