看到Event事件插件没有返回钩子return的数据,并且也没有检查钩子是否存在的函数,
在自己项目中像下面这样简单修改了下,并且也提交了ISSUES,但是未得到回复,
这两个功能使用的还是比较频繁的,所以请问下,Event是否会更新和融合进内核!
按照workerman一贯的做法,虽然追求简单就是多,可有些web常用,比如事件、路由这些,
代码量不多的情况下,感觉还是融合一体比较好!要不然一个项目里面加载的包,,太多!
/**
* @param $event_name
* @param $data
* @return
*/
public static function emit($event_name, $data, $once = false)
{
$success_count = 0;
$callbacks = static::$eventMap[$event_name]??[];
foreach (static::$prefixEventMap as $name => $callback_items) {
if (strpos($event_name, $name) === 0) {
$callbacks = array_merge($callbacks, $callback_items);
}
}
ksort($callbacks);
$ret = [];
foreach ($callbacks as $callback) {
try {
$ret[$event_name] = $callback($data, $event_name);
$success_count++;
} catch (\Throwable $e) {
if (!static::$logger && is_callable('\support\Log::error')) {
static::$logger = Log::channel();
}
if (static::$logger) {
static::$logger->error($e);
}
continue;
}
}
// 钩子事件返回数据是常用的
if ($once && isset($ret[$event_name])) {
return $ret[$event_name];
}
return $ret;
}
/**
* @return array
*/
public static function list(): array
{
$callbacks = [];
foreach (static::$eventMap as $event_name => $callback_items) {
foreach ($callback_items as $id => $callback_item) {
$callbacks[$id] = [$event_name, $callback_item];
}
}
foreach (static::$prefixEventMap as $event_name => $callback_items) {
foreach ($callback_items as $id => $callback_item) {
$callbacks[$id] = [$event_name.'*', $callback_item];
}
}
ksort($callbacks);
return $callbacks;
}
/**
* @param string $name
* @return void
*/
public static function has(string $name)
{
$list = static::list();
// 检查是否存在钩子也有必要
foreach ($list as $index => $item) {
if ($item[0] == trim($name)) {
return true;
}
}
return false;
}
主干已经添加 hasListener 方法,试下是否ok,ok的话先发个版本。Event 是否加入内核待定
好的,等会去测试下,刚看了代码,测试完后再提交个ISSUE
提交了一个新的issue,大佬有空查看下!