嗨,我对ZF2比较陌生,所以这可能是我犯的一个非常简单的错误。
问题
当加载ZfcTwig
模块时,我得到一个异常
致命错误:未捕获异常“Zend\ServiceManager\exception\ServiceNotFoundException”,消息为“Zend\ServiceManager\ServiceManager::get无法在/www/ZendFramework2/library/Zend/ServiceManager/ServiceManager中获取或创建Twig_环境的实例”。php在线555
此异常抛出在ZfcTwig\Module.php
的onBootstrap
函数中:
<?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环境
)。
问题就在我自己想知道的地方。在引导完成之前,需要加载配置。然而,这正是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,
)
);