我的引导程序中有一个方法可以为应用程序设置缓存:
protected function _initSetCaches()
{
$this->bootstrap(array('Db','CacheManager'));
Zend_Db_Table_Abstract::setDefaultMetadataCache(Master::cache('database'));
Zend_Translate::setCache(Master::cache());
Zend_Date::setOptions(array('cache' => Master::cache()));
Zend_Paginator::setCache(Master::cache());
Zend_Locale::setCache(Master::cache());
Zend_Locale_Data::setCache(Master::cache());
}
如您所见,我通过调用包含缓存方法的 Master 类来设置各种缓存。在缓存方法中,我获取引导对象(self::bootstrap())
然后从缓存管理器资源中获取缓存类型。这是我的 Master 类中的缓存方法:
public static function cache($type='core')
{
$registryKey = 'master_cache_' . $type;
if(!self::registry($registryKey)){
$manager = self::bootstrap()->getPluginResource('cachemanager')->getCacheManager();
if(!$manager->hasCache($type)){
self::throwException(sprintf("%s is not an available cache",$type));
}
$cache = $manager->getCache($type);
self::register($registryKey,$cache);
}
return self::registry($registryKey);
}
如您所见,此方法从引导程序 ( self::bootstrap()
) 中获取缓存管理器。我的问题如下......如果我按如下方式实现我的引导方法(通过应用程序对象(self::app()
)获取引导程序来注册引导程序:
public static function bootstrap()
{
if(!self::registry('master_bootstrap')){
self::register('master_bootstrap', self::app()->getBootstrap());
}
return self::registry('master_bootstrap');
}
然后一切正常。但是,这是与我最初拥有的不同的实现,因此会引发循环依赖异常。这是我的原始实现:
public static function bootstrap()
{
return self::app()->getBootstrap();
}
我很困惑为什么当我在全局注册表中注册引导程序时可以使用缓存方法,但是,如果我直接返回引导程序对象,则会导致循环依赖问题。我在全局注册表中注册引导对象的实现不应该仍然导致循环依赖吗?