fastadmin插件自动注册自定义命名空间和Hook

文章介绍了在插件开发时如何使用Hook来简化代码,通过在appInit中注册命名空间并遍历其下的类和方法,自动添加到Hook事件,避免了手动添加多个类文件和冗余代码。这种方法特别适用于处理大量方法的情况,提高了开发效率。
摘要由CSDN通过智能技术生成

在开发插件的时候,总是需要添加很多的其他类文件,如果library库太多导致在一个控制器引用很多个文件,导致忘记某个方法定义在什么类库,即便记得也需要写很多冗余代码

这时候Hook的作用就出来了,它可以将繁杂的代码量缩短到一行。

我们常规添加Hook方法如下

Hook::add($method, $namespace);

但是它只能针对单独一个方法进行添加,我们需要精确到告诉add对应的方法名和命名空间,

如果你有几十个方法或者几百个,那么就需要编写成百上千行

一招解决重复工作

首先在插件的appInit中,注册并添加你的自定义命名空间

Loader::addNamespace($space, ADDON_PATH. $addonName . DS . $directory);

然后遍历该命名空间下的类和公共方法,循环添加到我们的Hook事件当中

 

/**
 * $addonsName 改为你的插件名
 * $directory 改为你的命名空间目录
 */
public function appInit() {
    Loader::addNamespace('behavior', ADDON_PATH. $addonsName . DS . $directory);
    // 遍历命名空间里面的类名和方法
    $listFile = $this->listDir(realpath(__DIR__). DS . $directory, "\\addons\\$addonsName\\$directory\\");
    foreach($listFile as $item) {
        foreach($item['method'] as $method) {
            Hook::add($method, "\\addons\\$addonsName\\$directory\\".$item['className']);
        }
    }
}
/**
 * @param $directory
 * @return array|bool
 * 读取扩展行为类库的所有类名和公共方法,子目录不参与计算
 */
private function listDir($directory, $namespace) {
    $fileList = [];
    if(is_dir($directory)) {
        if($dir_handle = @opendir($directory)) {
            while($filename = readdir($dir_handle)) {
                if($filename != '.' && $filename != '..') {
                    $subFile = $directory. DS .$filename;
                    if(is_dir($subFile)) {
//                       return true;
                    } else {
                        $className = explode('.', $filename)[0];
                        $cls = $namespace.$className;
                        $ref = new \ReflectionClass(new $cls);
                        $methods = [];
                        foreach($ref->getMethods() as $item) {
                            if($item->isPublic()){
                                $methods[] = strtolower(preg_replace('/(?<=[a-z])([A-Z])/', '_$1', $item->name));
                            }
                        }
                        array_push($fileList, [
                            'className' => $className,
                            'method'    => $methods
                        ]);
                    }
                }
            }
        }
    } else {
        return false;
    }
    return $fileList;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

追寻自由的路上

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值