2015-02-06 3 views
1

Я пытаюсь обмениваться данными между вложениями событий в zf2.ZF2 обмен данными между обработчиками событий (attach)

, если быть точным, im прикрепляется к отсутствующему переводу, который является частью zf2-переводчика. Мне нужно поймать некоторые данные в missingTranslation, а затем в конце выполнения, Dispatch или Finish. Я собираюсь выполнить некоторую проверку данных, а затем, если все будет проверено, я собираюсь ее сохранить.

attach('missingTranslation', function ($e){ 
    // some kind of storage with $e->getParam('message'); 
}); 

attach(MvcEvent::EVENT_DISPATCH, function(){ 
    // some validation, checks and mangling 
    file_put_content({the_storage}); 
}); 

Я смотрел на кэширование данных, но с использованием XCache или АРС требует специального расширения, что сервер не имеет.

Так что мой вопрос: как мне это сделать?

+0

вы можете установить значение в одноэлементном режиме и получить его из диспетчера хранилища, но введение глобального состояния обычно не является моей любимой вещью. – STLMikey

+0

Да, глобальная идея - очень плохая идея. – KatsuoRyuu

ответ

0

Вы должны иметь возможность передавать информацию вместе с событием, прошедшим обратный вызов. как этот

$eventManager->attach(MvcEvent::EVENT_DISPATCH,function (MvcEvent $e) { 
    $e->setParam('test', 10); 
}, 200); 

$eventManager->attach(MvcEvent::EVENT_DISPATCH,function (MvcEvent $e) { 
    var_dump($e->getParam('test')); 
}, 100); 

Это будет выход 10 на var_dump

+0

Спасибо, что помогло мне найти проблему. вы используете 2 события DISPATCH, но DISPATCH перед отсутствием трансляции, поэтому для меня это не сработало (я опубликовал свой личный результат для других, чтобы увидеть) – KatsuoRyuu

0

Извините за ожидание.

Мне потребовалось некоторое время, чтобы заметить, что, конечно, событие DISPATCH фактически выполняется до события, пропускающего трансляцию.

поэтому вместо DISPATCH я использую FINISH

$this->translatorEventManager->attach('missingTranslation',function ($e) use (&$storage) 
    { 
     if ($this->config['string_length'] <= strlen($e->getParam('message')) 
      || $this->config['string_length'] == -1 
     ) { 
      $backtrace = debug_backtrace(); 
      $ref = str_replace($this->config['zf_base_path'], 
        '', 
        $backtrace[10]['file'] 
       ) 
       . ':' . $backtrace[10]['line']; 
      $storage[$e->getParam('locale')][] = array(
       'message_id'  => $e->getParam('message'), 
       'message_string' => '', 
       'domain'   => $e->getParam('domain'), 
       'reference'  => $ref, 
      ); 
     } else { 
      // LOAD FROM DATABASE 
     } 

    }); 
    $this->appEventManager->attach(MvcEvent::EVENT_FINISH, function($e) use ($translator, &$storage) { 
     $translator 
      ->addTranslations($storage) 
      ->save(); 
    }); 

некоторые из вас могут сказать, что это очень плохой способ сделать это, потому что debug_backtract(), как известно, есть много времени. и он будет сильно мешать модулям на ботстрапе.

Для того, чтобы это нормально работать, система запускает внешнюю команду curl в фоновом режиме, а затем запускает ту же страницу, но с параметром «thread». , так что даже если вам понадобится 1мин для запуска всего модуля, пользователь никогда его не заметит.

Смежные вопросы