ZF2 在事件处理程序之间共享数据(附加)
ZF2 sharing data between event handlers (attach)
我正在尝试在 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 需要服务器没有的特殊扩展。
所以我的问题是我该怎么做?
您应该能够将信息与事件一起传递给回调。像这样
$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
抱歉久等了。
我花了一些时间才注意到,当然,事件 DISPATCH 实际上在事件 missingTranslation 之前 运行s。
所以我使用的不是 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() 会消耗很多时间。并且会使 onBootstrap 模块变得混乱。
为了更好地 运行 宁,系统在后台 运行宁一个外部 curl 命令,然后它 运行 同一个页面,但带有参数"thread"。
所以即使 运行 整个模块需要 1 分钟,用户也不会注意到它。
我正在尝试在 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 需要服务器没有的特殊扩展。
所以我的问题是我该怎么做?
您应该能够将信息与事件一起传递给回调。像这样
$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抱歉久等了。
我花了一些时间才注意到,当然,事件 DISPATCH 实际上在事件 missingTranslation 之前 运行s。
所以我使用的不是 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() 会消耗很多时间。并且会使 onBootstrap 模块变得混乱。
为了更好地 运行 宁,系统在后台 运行宁一个外部 curl 命令,然后它 运行 同一个页面,但带有参数"thread"。 所以即使 运行 整个模块需要 1 分钟,用户也不会注意到它。