2013-10-13 4 views
0

У меня есть этот код:Zend Framework 2 Invalidate кэш переводчик

'translator' => array(
... 
'cache' => array(
    'adapter' => array(
     'name' => 'Filesystem', 
     'options' => array(
      'cache_dir' => __DIR__ . '/../../../data/cache', 
      'ttl'  => '3600' 
     ) 
    ), 
    'plugins' => array(
     array(
      'name' => 'serializer', 
      'options' => array() 
     ), 
     'exception_handler' => array(
      'throw_exceptions' => true 
     ) 
    ) 
) 

Вопрос в том, как я аннулирует его не TTL?

Например, я ЗНАЮ, когда перевод был изменен, поэтому я хочу сделать недействительным по требованию, но я не нашел способ сделать это.

ответ

0

Я думаю, вы могли бы установить Ttl = 0 (всегда), а кеш (файл) больше недействителен - удалите его.

+0

Но в тот момент, когда кэш уже загружен ... Как установить TTL 0, мне нужно сделать недействительным его и перезагрузить новый. –

+0

В конфигурационном файле, где у вас есть 3600. – akond

+0

Но это конфиг ... Мне нужно сделать недействительным его при обновлении ... –

1

Компонент переводчика не использует TaggableInterface, поэтому вам необходимо знать cacheId, который создает транслятор для очистки элемента от вашего адаптера хранения. Вы можете использовать следующий код, чтобы просто сгенерировать один и тот же идентификатор и удалить элемент. Вызовите это из своего сервиса или прослушивателя событий.

$translator = $sm->get('McvTranslator'); 
$textDomain = 'default'; 
$locale = 'en'; 

$cacheId = 'Zend_I18n_Translator_Messages_' . md5($textDomain . $locale); 
$translator->getCache()->removeItem($cacheId); 
+0

Проблема с этим, что у меня много языков ... И чтобы сделать их недействительными, будет означать чтобы перебрать все из них ... –

+0

Я бы не стал так беспокоиться об этом. Если у вас уже есть список поддерживаемых локалей для вашего приложения, вы можете легко перебрать их и сделать недействительными. В качестве альтернативы вы можете перезаписать компонент транслятора и реализовать тег для каждого textDomain и вызвать clearByTag, если вы хотите сделать недействительным, но за кулисами ZF все равно отменит то же количество файлов в вашей файловой системе, поэтому у вас не будет никаких преимуществ производительности используя этот подход. –

0

Другой способ сделать это: Найти точку в вашем коде, где вы называете addTranslation.

Например:

$translate = Zend_Registry::get('Zend_Translate'); 
$translate->addTranslation(array(
      'content' => "$dir/$locale.mo", 
      'locale' => $locale 
     )); 

Изменение функции addTranslation добавить reload => true, как это:

$translate->addTranslation(array(
      'content' => "$dir/$locale.mo", 
      'locale' => $locale, 
     'reload' => true 
     )); 

Обновить страницу. Voila. После этого следует удалить reload, иначе у вас не будет кеша.