看到Event事件插件沒有返回鉤子return的數(shù)據(jù),并且也沒有檢查鉤子是否存在的函數(shù),
在自己項目中像下面這樣簡單修改了下,并且也提交了ISSUES,但是未得到回復(fù),
這兩個功能使用的還是比較頻繁的,所以請問下,Event是否會更新和融合進內(nèi)核!
按照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;
}
}
// 鉤子事件返回數(shù)據(jù)是常用的
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;
}