为缓存的 ZF2 翻译文件添加前缀
Add prefix to cached ZF2 translation files
我正在使用 ZF2 I18n 翻译器和 memcached。设置为:
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
的自定义 class CsvLoader
的文件。那部分效果很好。
$translator->addTranslationFile('CsvLoader', $translation_file_name, 'section');
我的问题是当我想清除缓存时。我目前可以通过命名空间或什么都不清除所有 locales/files 一次。如何为缓存中的每个添加的翻译文件添加 prefix/suffix?
我目前看到的值如下
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
更新
这里有一个link到Bram提到的哈希生成的相关源代码https://github.com/zendframework/zf2/blob/master/library/Zend/I18n/Translator/Translator.php#L553
没有配置要在缓存键中使用的后缀的选项。
我有 2 个选项。
1) 扩展Translator
class 并覆盖loadMessages()
方法,根据您的需要自定义代码。您将不得不复制此方法中的所有代码,这实际上并不可行,并且当 ZF 开发人员更改代码或实现新功能时会导致维护问题。
2) 缓存键构建如下:
$cacheId = 'Zend_I18n_Translator_Messages_' . md5($textDomain . $locale);
要使区域设置 es
和 default
文本域的缓存无效,您可以使用相同的代码自己重建缓存键,并使用缓存适配器删除给定的键。
$memcache_adapter->removeItem('Zend_I18n_Translator_Messages_' . md5('defaultes');
我正在使用 ZF2 I18n 翻译器和 memcached。设置为:
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
的自定义 class CsvLoader
的文件。那部分效果很好。
$translator->addTranslationFile('CsvLoader', $translation_file_name, 'section');
我的问题是当我想清除缓存时。我目前可以通过命名空间或什么都不清除所有 locales/files 一次。如何为缓存中的每个添加的翻译文件添加 prefix/suffix?
我目前看到的值如下
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
更新
这里有一个link到Bram提到的哈希生成的相关源代码https://github.com/zendframework/zf2/blob/master/library/Zend/I18n/Translator/Translator.php#L553
没有配置要在缓存键中使用的后缀的选项。 我有 2 个选项。
1) 扩展Translator
class 并覆盖loadMessages()
方法,根据您的需要自定义代码。您将不得不复制此方法中的所有代码,这实际上并不可行,并且当 ZF 开发人员更改代码或实现新功能时会导致维护问题。
2) 缓存键构建如下:
$cacheId = 'Zend_I18n_Translator_Messages_' . md5($textDomain . $locale);
要使区域设置 es
和 default
文本域的缓存无效,您可以使用相同的代码自己重建缓存键,并使用缓存适配器删除给定的键。
$memcache_adapter->removeItem('Zend_I18n_Translator_Messages_' . md5('defaultes');