Php ZF2在事件处理程序之间共享数据(附加)
我正在尝试在zf2中的事件附件之间共享数据 确切地说,我附加到missingTranslation,它是zf2翻译器的一部分。 我需要在missingTranslation中捕获一些数据,然后在执行、分派或完成时,我将对数据进行一些验证,如果所有内容都经过验证,我将保存它Php ZF2在事件处理程序之间共享数据(附加),php,events,zend-framework2,Php,Events,Zend Framework2,我正在尝试在zf2中的事件附件之间共享数据 确切地说,我附加到missingTranslation,它是zf2翻译器的一部分。 我需要在missingTranslation中捕获一些数据,然后在执行、分派或完成时,我将对数据进行一些验证,如果所有内容都经过验证,我将保存它 attach('missingTranslation', function ($e){ // some kind of storage with $e->getParam('message'); }); att
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需要特殊的扩展,而服务器没有这种扩展
所以我的问题是如何做到这一点?您应该能够将信息与传入的事件一起传递到回调。像这样
$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_转储上输出10,抱歉等待
我花了一些时间才注意到,当然,事件调度实际上是在EventMissingTranslation之前运行的
所以我用FINISH代替DISPATCH
$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命令,然后运行同一个页面,但使用param线程。
因此,即使运行整个模块需要1分钟,用户也不会注意到它。您可以在单例上设置值并从存储管理器中检索,但引入全局状态通常不是我最喜欢的内容。是的,全局是一个非常糟糕的主意。感谢您帮助我发现了问题。您正在使用2个调度事件,但调度是在缺少翻译之前进行的,这就是为什么它对我不起作用的原因我将我的个人结果发布给其他人查看