要在ThinkPHP项目中快速添加新功能又不改动核心代码,必须靠插件机制实现——插件目录放对、入口文件命名严格匹配、$info数组字段一个都不能少,否则后台根本看不到安装按钮。

创建插件目录与入口文件
在项目根目录下的 addons 文件夹里新建一个子目录,名字必须全大驼峰且与后续入口文件名完全一致,比如你要做“HelloWorld”插件,就建 addons/HelloWorld 目录。
进入该目录,新建一个 PHP 文件,文件名必须和目录名一模一样,后缀为 .php,即 HelloWorld.php;不能叫 helloworld.php、index.php 或 HelloWorld.class.php。
打开 HelloWorld.php,第一行写命名空间 namespace addons\HelloWorld;,注意 addons\ 前缀不可省略,漏掉就加载失败。
类名必须是 HelloWorld,且继承 \think\addons\Addon(TP6.1+)或 \app\common\controller\Addons(部分老TP5定制版),继承错类会导致 install() 方法压根不触发。
立即学习“PHP免费学习笔记(深入)”;
定义插件元信息$info数组
在 HelloWorld 类内部顶部,声明 public $info = [] 数组,它不是可选项,而是系统扫描插件时的硬性过滤条件——缺任何一项,插件就不会出现在后台列表里。
这个数组必须包含以下5个键:
name:纯英文小写+下划线,如 'hello_world',用于系统内部标识;
title:中文标题,会直接显示在后台插件管理页,如 'Hello World 示例插件';
identifier:全局唯一 ID,格式为 '插件名.作者标识.plugin',例如 'hello_world.lwwan.plugin',重复会导致安装失败;
version:三段式版本号,如 '1.0.0',升级时靠它比对,写成 '1' 或 'v1' 会被跳过;
author:作者名,不能为空字符串,也不能只填邮箱。
实现install()与uninstall()方法
第一步:在 HelloWorld 类中添加 install() 方法,方法体内至少要返回 true,否则点击安装按钮后无反应;
第二步:如果插件需要建表,把 SQL 写进 install.sql 文件,放在插件目录下,然后在 install() 中用 Db::execute() 执行——但注意:SQL 语句末尾不能带分号,否则执行报错;
第三步:添加 uninstall() 方法,同样必须显式 return true;,否则卸载按钮点击无效;
第四步:确保项目 runtime/ 目录对 Web 进程用户(如 www-data 或 nginx)有写权限,否则 install() 中的日志、缓存、表结构变更全部失败;
第五步:修改完插件后,务必执行 php think clear 清空应用缓存,否则后台仍显示旧状态或根本不刷新插件列表。
手动绑定插件路由(如需访问前端页面)
插件默认不自动注册路由,必须在 application/route/app.php 或 route/app.php(依TP版本而定)中手动添加:
Route::get('hello', 'addon/HelloWorld/Index/index');
注意控制器路径写法:addon/插件名/控制器名/方法名,中间用斜杠,不是反斜杠;
控制器类必须放在 addons/HelloWorld/controller/ 目录下,命名空间为 addons\HelloWorld\controller,类名首字母大写,如 Index.php → class Index;
如果路由绑定后 404,先检查 controller 目录是否存在、文件名是否为 Index.php、类名是否拼写正确——大小写错一个字母,TP 就找不到控制器。



















