插件控制器也可分为后台控制器(admin)和前台控制器(home),如果你的插件不需要用到钩子功能而又需要分前后台,还是建议你用模块的方式来开发。 >[danger]在开始插件开发前,一定要了解清楚插件的目录结构 ~~~ /plugins/test/ ├─admin 插件后台目录 │ ├─Index.php 控制器文件 ├─home 插件前台目录 │ ├─Index.php 控制器文件 ├─model 插件模型目录 ├─sql 模块SQL文件目录 │ ├─install.sql 安装SQL文件 │ ├─uninstall.sql 卸载SQL文件 ├─static 插件静态资源目录 ├─validate 验证器目录 ├─view 插件模板目录 │ ├─admin 插件后台模板目录 │ │ ├─index 控制器模板目录(以控制器命名) │ │ │ ├─show.php 模板文件(以操作方法命名) │ ├─home 插件前台模板目录(以控制器命名) │ │ ├─index 控制器模板目录(以控制器命名) │ │ │ ├─detail.php 模板文件(以操作方法命名) │ ├─widget 插件钩子模板目录 │ │ │ ├─system_hook.php 钩子模板(示例) ├─info.php 插件基本信息 ├─menu.php 插件后台管理菜单节点 ├─test.php 插件与钩子的实现方法 ├─test.png 插件图标 ~~~ ## 后台控制器(/plugins/test/admin/) 创建Index控制器``/plugins/test/admin/Index.php``,所有插件后台控制器必须继承`` app\common\controller\Common`` 控制器,控制器里面的数据库增删改查、验证等均跟ThinkPHP5完全一样。示例代码如下: ~~~php <?php // 命名空间 namespace plugins\test\admin; // 引入Common控制器 use app\common\controller\Common; // 建议加上此段代码,防止外部直接访问此控制器 defined('IN_SYSTEM') or die('Access Denied'); /** * [测试插件]后台Index控制器 * @package plugins\test\admin */ class Index extends Common { public function show() { $data = []; $this->assign('data', $data); return $this->fetch(); } } ~~~ >[info] 后台控制器访问路径:/admin.php/admin/plugins/run?_p=test&_c=index&_a=show ## 前台控制器(/plugins/test/home/) 创建Index控制器``/plugins/test/home/Index.php``,所有插件前台控制器必须继承`` app\common\controller\Common`` 控制器,控制器里面的数据库增删改查、验证等均跟ThinkPHP5完全一样。示例代码如下: ~~~php <?php // 命名空间 namespace plugins\test\home; // 引入Common控制器 use app\common\controller\Common; // 建议加上此段代码,防止外部直接访问此控制器 defined('IN_SYSTEM') or die('Access Denied'); /** * [测试插件]前台Index控制器 * @package plugins\test\home */ class Index extends Common { public function detail() { $data = []; $this->assign('data', $data); return $this->fetch(); } } ~~~ >[info] 前台控制器访问路径,支持两种路径格式: >格式1:/plugins/test/index/detail >格式2:/plugins.php?_p=test&_c=index&_a=detail