Добавить префикс к кешированным файлам перевода ZF2

Я использую транслятор 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 );

(Все слова с заглавной буквы являются константами.)

Затем я добавляю файлы с пользовательским классом CsvLoader, который расширяет AbstractFileLoader. Эта часть отлично работает.

$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.


person brian_d    schedule 03.04.2015    source источник
comment
Ваш пример представляет собой настройку memcached, но вы описываете хранилище файловой системы. (С memcached вы не можете очистить кешированные записи по пространству имен или префиксу)   -  person mabe.berlin    schedule 13.04.2015
comment
Я отредактировал свой пост, чтобы объяснить, как я в настоящее время очищаю записи. Спасибо.   -  person brian_d    schedule 13.04.2015


Ответы (1)


Нет возможности настроить суффикс, который вы хотите использовать в ключе кэша. У вас есть 2 варианта имхо.

1) Расширьте класс Translator и переопределите метод loadMessages(), настройте код под свои нужды. Вам придется дублировать весь код в этом методе, что на самом деле невозможно и вызовет проблемы с обслуживанием, когда разработчики ZF изменят код или реализуют новые функции.

2) Ключ кэша создается следующим образом:

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

Для аннулирования кеша для локали es и текстового домена default вы можете просто восстановить ключ кеша самостоятельно, используя тот же код, и удалить данный ключ с помощью адаптера кеша.

$memcache_adapter->removeItem('Zend_I18n_Translator_Messages_' . md5('defaultes');
person Bram Gerritsen    schedule 06.04.2015
comment
Спасибо. Ваше второе предложение будет работать для этого приложения, пока я буду отслеживать текстовые домены, которые где-то используются. - person brian_d; 13.04.2015