ZF2在事件处理程序之间共享数据(附加)

时间:2015-02-06 04:59:32

标签: php events zend-framework2

我试图在zf2中的事件附件之间共享数据。

确切地说,我附加到missingTranslation,它是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或apc需要特殊扩展,服务器没有。

所以我的问题是我该怎么做?

2 个答案:

答案 0 :(得分: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

上输出10

答案 1 :(得分:0)

对不起等待。

我花了一些时间注意到事件DISPATCH实际上在事件missingTranslation之前运行。

所以不是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分钟,用户也不会注意到它。