2

ブートストラップ内に、アプリケーションのキャッシュをセットアップするメソッドがあります。

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());
 }

ご覧のとおり、キャッシュ メソッドを含むマスター クラスを呼び出して、さまざまなキャッシュを設定しました。キャッシュ メソッド内で、ブートストラップ オブジェクトをフェッチし (self::bootstrap())次に、cachemanager リソースからキャッシュ タイプを取得します。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();
}

グローバル レジストリ内にブートストラップを登録するときにキャッシュ メソッドを使用できる理由について混乱していますが、ブートストラップ オブジェクトを直接返すだけでは循環依存の問題が発生します。ブートストラップ オブジェクトをグローバル レジストリに登録する実装は、依然として循環依存を引き起こすべきではありませんか?

4

0 に答える 0