webman Event事件是否增加返回值 + has函数

meystack

看到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;
    }
748 1 0
1个回答

walkor

主干已经添加 hasListener 方法,试下是否ok,ok的话先发个版本。Event 是否加入内核待定

  • meystack 2022-08-14

    好的,等会去测试下,刚看了代码,测试完后再提交个ISSUE

  • meystack 2022-08-14

    提交了一个新的issue,大佬有空查看下!

年代过于久远,无法发表回答
🔝