2015-02-06 69 views
1

我试图在zf2中的事件附件之间共享数据。ZF2在事件处理程序之间共享数据(附加)

准确的说,IM附接到missingTranslation其是部分ZF2翻译。 我需要在missingTranslation中捕获一些数据,然后在执行结束时调度或完成我将对数据进行一些验证,然后如果所有内容都经过验证,我将保存它。

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或apc需要特殊的扩展名,即服务器没有。

所以我的问题是我如何做到这一点?

+0

您可以为一个单值,并从存储管理器检索它,但引入全局状态通常不是我最喜欢的事情是 – STLMikey 2015-02-06 20:42:27

+0

全局是一个非常糟糕的主意。 – KatsuoRyuu 2015-02-15 15:06:14

回答

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); 

这将在后续代码var_dump

+0

谢谢,这帮助我找到了问题。您正在使用2个DISPATCH事件,但DISPATCH在missingTranslation之前,这就是为什么它不适合我(我发布了我的个人结果供其他人看) – KatsuoRyuu 2015-02-15 15:05:01

0

对不起,等待输出10。

我花了一些时间去注意,当然,事件调度实际事件missingTranslation之前运行。

所以不是派遣我使用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()被称为是吃了不少的时间。它会在Bootstrap上混乱很多。

为了得到这个运行良好,系统在后台运行的外部curl命令,然后将其运行在同一个页面,但与参数“线程”。 所以即使运行整个模块需要1分钟,用户也不会注意到它。