Skip to content
CatchAdmin 插件市场也正式上线啦!!! GO ! 还有 CatchAdmin 正在参加 Gitee 2025 最受欢迎的开源软件投票活动 ⭐请给我投一票吧!

插件生命周期钩子

钩子(Hook)是插件与 CatchAdmin 系统交互的桥梁,让你可以在插件安装、更新、卸载的各个阶段执行自定义逻辑。

钩子文件

每个插件根目录下都有一个 hook.php 文件,包含一个 Hook 类:

php
<?php

class Hook
{
    public function beforeInstall(array $context): void { }
    
    public function afterInstall(array $context): void { }
    
    public function beforeUpdate(array $context): void { }
    
    public function afterUpdate(array $context): void { }
    
    public function beforeUninstall(array $context): void { }
    
    public function afterUninstall(array $context): void { }
}

钩子方法一览

钩子方法触发时机常见用途
beforeInstall安装前检查安装条件、验证环境依赖
afterInstall安装后创建菜单、初始化数据、发布配置
beforeUpdate更新前备份数据、记录旧版本信息
afterUpdate更新后执行数据迁移、更新缓存
beforeUninstall卸载前备份用户数据、确认卸载
afterUninstall卸载后清理菜单、删除相关数据

Context 参数

每个钩子方法都会接收一个 $context 数组,包含插件的基本信息:

php
$context = [
    'name'      => 'test/test',           // 包名
    'version'   => '1.0.0',               // 版本号
    'path'      => 'vendor/.../test',     // 安装路径
    'namespace' => 'Test\Test',           // 根命名空间
];

常见应用场景

1. 安装时自动创建菜单

php
public function afterInstall(array $context): void
{
    Plugin::createMenus([
        Plugin::createMenu('我的插件', '/my-plugin', $context['namespace'], children: [
            Plugin::createMenu('用户管理', 'users', $context['namespace'],
                controller: 'UserController',
                controllerMethod: 'index',
                type: 2,
                component: Plugin::view('my/plugin', 'users.index')
            )
        ])
    ]);
}

2. 卸载时清理菜单

php
public function afterUninstall(array $context): void
{
    // 删除该插件创建的所有菜单
    Permissions::where('module', $context['namespace'])->delete();
}

3. 安装前检查条件

php
public function beforeInstall(array $context): void
{
    // 检查 PHP 版本
    if (version_compare(PHP_VERSION, '8.1', '<')) {
        throw new \RuntimeException('此插件需要 PHP 8.1 或更高版本');
    }
    
    // 检查依赖扩展
    if (!extension_loaded('redis')) {
        throw new \RuntimeException('此插件需要 Redis 扩展');
    }
}

4. 安装后初始化数据

php
public function afterInstall(array $context): void
{
    // 执行数据库迁移
    Artisan::call('migrate', [
        '--path' => $context['path'] . '/migrations'
    ]);
    
    // 发布配置文件
    Artisan::call('vendor:publish', [
        '--tag' => 'my-plugin-config'
    ]);
    
    // 初始化默认数据
    \DB::table('settings')->insert([
        'key' => 'my_plugin_enabled',
        'value' => 'true'
    ]);
}

5. 更新前备份数据

php
public function beforeUpdate(array $context): void
{
    // 备份配置
    $config = config('my-plugin');
    file_put_contents(
        storage_path('backups/my-plugin-config.json'),
        json_encode($config)
    );
}

6. 卸载前确认并备份

php
public function beforeUninstall(array $context): void
{
    // 导出用户数据
    $users = \DB::table('my_plugin_users')->get();
    file_put_contents(
        storage_path('backups/my-plugin-users.json'),
        json_encode($users)
    );
}

注意事项

⚠️ 重要提示

  1. 钩子中可以使用 Laravel 功能:包括 Eloquent、Artisan、配置、日志等
  2. beforeInstall 抛出异常可阻止安装:用于环境检查
  3. afterUninstall 时包文件仍存在:可以访问插件的静态资源
  4. 钩子方法是实例方法:不是静态方法

下一步