2015-04-03 40 views
2

我正在使用ZF2 I18n翻譯器和memcached。設置爲:向緩存的ZF2翻譯文件添加前綴

use Zend\I18n\Translator\Translator; 
use Zend\Cache\Storage\Adapter\MemcachedResourceManager as MemcachedResourceManager; 

//=== setup the cache ===// 
//create a memcached resource manager 
$memcached_resource_manager = new MemcachedResourceManager(); 
$memcached_resource_manager->addServer(RESOURCE_ID, array('localhost', '11211')); 

//create memcached options 
$memcached_options = new \Zend\Cache\Storage\Adapter\MemcachedOptions(array(
     'resource_manager' => $memcached_resource_manager, 
     'resource_id'  => RESOURCE_ID, 
     'namespace'  => CACHE_NAMESPACE, 
     'ttl'    => 3600, 
     ) 
    ); 

//create memcached adapter 
$memcached_adapter = new \Zend\Cache\Storage\Adapter\Memcached($memcached_options); 
//== end cache setup ===// 

//create translator 
$translator = new Translator(); 
$translator->setCache($memcached_adapter); 

(所有大寫單詞是常數。)

然後我添加文件使用擴展AbstractFileLoader自定義類CsvLoader。這部分工作很好。

$translator->addTranslationFile('CsvLoader', $translation_file_name, 'section'); 

我的問題是當我想清除緩存。我現在可以通過命名空間或一次性清除所有語言環境/文件。如何爲緩存中的每個添加的翻譯文件添加前綴/後綴?

我目前看到像 CACHE_NAMESPACE:Zend_I18n_Translator_Messages_7a1565097c5fca5a3138b2330c2451db

價值觀,我想看到像 CACHE_NAMESPACE:Zend_I18n_Translator_Messages_es_MX_7a1565097c5fca5a3138b2330c2451db

其顯示區域設置的條目。 謝謝。

其他信息 要清除我目前正在與檢索項條目:

$entries = $translator->getCache()->getOptions()->getResourceManager()->getResource(self::RESOURCE_ID)->getAllKeys()

(這似乎是一個可笑的長函數鏈到我 - 一種更好的方式建議,歡迎)和然後循環檢查項目名稱。如果一個項目一個條件匹配,我叫removeItem

更新

下面是哈希生成該布拉姆提到https://github.com/zendframework/zf2/blob/master/library/Zend/I18n/Translator/Translator.php#L553

+0

你的例子是一個memcached設置,但你描述了文件系統存儲。 (使用memcached時,無法通過名稱空間或前綴清除緩存的條目) – 2015-04-13 14:38:29

+0

我已編輯我的帖子以解釋我目前如何清除條目。謝謝。 – 2015-04-13 20:46:02

回答

1

相關源代碼的鏈接沒有任何選項來配置後綴你想在緩存鍵中使用。 你有2個選項伊莫。

1)擴展Translator類並覆蓋loadMessages()方法,根據需要自定義代碼。您必須複製此方法中的所有代碼,這是不可行的,並且會在ZF開發人員更改代碼或實現新功能時導致維護問題。

2)高速緩存關鍵是建立如下:

$cacheId = 'Zend_I18n_Translator_Messages_' . md5($textDomain . $locale); 

對於緩存區域es無效和default textdomain你可以重建緩存使用相同的代碼鍵入自己和除去給定的密鑰使用緩存適配器。

$memcache_adapter->removeItem('Zend_I18n_Translator_Messages_' . md5('defaultes'); 
+0

謝謝。您的第二個建議將適用於此應用程序 - 只要我跟蹤某處使用的文本域即可。 – 2015-04-13 20:47:58