我的引导程序中有一个方法可以为应用程序设置缓存:
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();
}
我很困惑为什么当我在全局注册表中注册引导程序时我可以使用缓存方法,但是,如果我只是直接返回引导程序对象,则会导致循环依赖性问题。我在全局注册表中注册引导对象的实现是否仍然会导致循环依赖?