插件必须放在与app/并列的addons/目录(如addons/wechat_login),且目录名、addon.php中name和path须严格一致;需配置route.php路由、使用think-migration管理迁移,并执行composer dump-autoload -o。

插件目录必须放在 app/ 外层,不能塞进 app/ 里
ThinkPHP 默认把所有业务代码当“应用”管,app/ 下只认控制器、模型、中间件这些固定角色。插件一旦放进去,路由扫描、自动加载、命令行工具(比如 php think)全会错乱——它压根不认为那是可独立启停的扩展单元。
正确位置是和 app/ 并列的 addons/ 目录(官方推荐)或 plugins/(需手动注册)。这个层级决定了插件是否能被框架“看见”且隔离加载。
-
addons/是 TP6+ 官方约定路径,think-addons等主流插件包默认读这里 - 插件名必须是合法 PHP 命名(小写字母+下划线),例如
wechat_login,否则自动加载失败 - 每个插件子目录下必须有
addon.php入口文件,内容是返回数组配置,缺了就识别为无效插件
addon.php 里 name 和 path 必须严格匹配实际路径
这是最常踩的坑:改了插件目录名但忘了同步改 addon.php 里的 name,或者用相对路径写 path 导致类自动加载失败。TP 加载插件时,先按 name 找目录,再按 path 定位命名空间根路径,两处对不上就直接跳过。
示例(addons/wechat_login/addon.php):
立即学习“PHP免费学习笔记(深入)”;
return [
'name' => 'wechat_login',
'title' => '微信登录',
'path' => 'addons\wechat_login\',
'has_admin' => true,
];
-
name必须和目录名完全一致(区分大小写),不能写成WechatLogin -
path是命名空间前缀,用双反斜杠,末尾带反斜杠;若写成addons/wechat_login/(斜杠)或漏掉末尾反斜杠,类加载器找不到WechatLoginService - 如果插件用了自己的
composer.json,记得在项目根目录执行composer dump-autoload -o,否则新类不进自动加载映射
插件内控制器不能直接放 controller/,得走 route 显式绑定
TP 不会自动扫描插件目录下的 controller/ 子目录。你放了 addons/wechat_login/controller/LoginController.php,没配路由,访问 /wechat_login/login 就是 404。
必须在插件的 route.php(同级于 addon.php)里声明:
use thinkacadeRoute;
Route::group('wechat_login', function () {
Route::get('login', 'addons\wechat_login\controller\LoginController@index');
})->middleware(['check_install']);
- 路由前缀(如
wechat_login)最好和插件name一致,避免冲突 - 控制器完整命名空间必须写全,不能省略
addons\wechat_login\,否则 TP 在默认命名空间里找 - 中间件要自己挂,插件不继承应用级中间件,
check_install这类校验必须显式加
插件迁移数据库要用 think-migration 而非原生 php think migrate
TP 自带的迁移命令只扫 database/migrate/,插件的迁移文件(比如 addons/wechat_login/database/migrate/20230101_create_wechat_users_table.php)根本不会被执行。
- 必须用社区方案
think-migration,它支持通过配置指定多路径,例如在config/migration.php加: 'paths' => ['database/migrate/', 'addons/*/database/migrate/'],- 插件迁移类的命名空间必须是
AddonsWechatLoginDatabaseMigrate,和目录结构严格对应,否则think-migration加载失败 - 上线前务必手动验证:进入插件目录运行
php think migrate:status,确认状态列为Yes
插件目录结构不是靠“看起来整齐”决定的,而是由框架加载器的路径解析规则、自动加载器的命名空间映射、以及迁移工具的扫描逻辑共同咬合而成。少一个反斜杠、多一个大小写、漏一行配置,整个插件就处于“存在但不可用”的黑盒状态。



















