自定义扩展范例:
某些情况下,不便于公开通过composer来安装扩展,可通过tp框架的extend目录来安装扩展。
自定义扩展与composer扩展目录比较
假如有一个composer扩展extdemo,那么他的目录大概是这样:
扩展根目录:wwwroot\vendor\ichynul\extdemo\
── assets (资源,不需则留空,发布时复制到`/public/assets/`)
├── css
├── images
└── js
── data (安装或卸载脚本,不需要安装则留空)
├── install.sql
└── uninstall.sql
── src (源码目录)
├── admin (admin模块)
│ ├── controller
│ ├── ...
│ ├── model
│ ├── ...
└── common
│ └── Module.php (模块定义)
├── common.php
├── config.php (扩展自定义配置)
└── helper.php (扩展加载)
── composer.json
── LICENSE.txt
── README.md
PS : tp框架的extend加载原理。自动查找extend目录下的目录和文件,根据目录结构转换为对应的命名空间。
thinkphp\library\Loader.php (line:114):
// 自动加载extend目录
self::addAutoLoadDir($rootPath . 'extend');把它改造为自定义扩展:
根目录:wwwroot\extend\extdemo\
── assets (资源,不需则留空,发布时复制到`/public/assets/`)
├── css
├── images
└── js
── data (安装或卸载脚本,不需要安装则留空)
├── install.sql
└── uninstall.sql
── admin (admin模块)
├──controller
├──...
├──model
├──...
common
└── Module.php (模块定义)
── config.php (扩展自定义配置)
── common.php
── LICENSE.txt
── README.md
改造要点:
- 不需要
composer.json。 - 不需要
src。代码直接放扩展根目录。 - 不需要
helper.php。 - 修改
Module.php中$root定义,由于代码从src目录往上提了一级,所以:protected $root = __DIR__ . '/../../';改为:protected $root = __DIR__ . '/../'; - 由于不能通过
helper.php来加载扩展,所以需要在【扩展管理】-【tpext基础】的配置中加入extdemo\common\Module,刷新。 - 修改
LICENSE.txt文件 - 修改
readme.md,由于自定义插件不能加载其他composer扩展,若你的自定义扩展依赖于其他composer扩展,可在其中说明需要安装哪些。 - 目前只支持一级目录的扩展:
── extend
├── mymouule1(支持)
├── mymouule2(支持)
└── hismouule3(支持)
不支持二级的扩展,如:
── extend
└── mymouule
│ ├── mymouule1 (二级目录下不支持)
│ └── mymouule2 (二级目录下不支持)
└── hismouule3(支持)
所有如果你同时使用其他人的扩展,给自定义扩展起名是要避免命名冲突