应用插件

每个应用插件是一个完整的应用,源码放置于{主项目}/plugin目录下

提示 使用命令php webman app-plugin:create {插件名} 可以在本地创建一个应用插件, 例如 php webman app-plugin:create cms 将创建如下目录结构。

  1. plugin/
  2. └── cms
  3. ├── app
  4. ├── controller
  5. └── IndexController.php
  6. ├── exception
  7. └── Handler.php
  8. ├── functions.php
  9. ├── middleware
  10. ├── model
  11. └── view
  12. └── index
  13. └── index.html
  14. ├── config
  15. ├── app.php
  16. ├── autoload.php
  17. ├── container.php
  18. ├── database.php
  19. ├── exception.php
  20. ├── log.php
  21. ├── middleware.php
  22. ├── process.php
  23. ├── redis.php
  24. ├── route.php
  25. ├── static.php
  26. ├── thinkorm.php
  27. ├── translation.php
  28. └── view.php
  29. └── public

我们看到一个应用插件有着与webman相同的目录结构及配置文件。实际上开发一个应用插件与开发一个webman项目体验基本一致,只需要注意以下几个方面。

命名空间

插件目录及命名遵循PSR4规范,因为插件都放置于plugin目录下,所以命名空间都以plugin开头,例如plugin\cms\app\controller\UserController,这里cms是插件的源码主目录。

url访问

应用插件url地址路径都以/app开头,例如plugin\cms\app\controller\UserControllerurl地址是 http://127.0.0.1:8787/app/cms/user

静态文件

静态文件放置于plugin/{插件}/public下,例如访问http://127.0.0.1:8787/app/cms/avatar.png实际上是获取plugin/cms/public/avatar.png文件。

配置文件

插件的配置与普通webman项目一样,不过插件的配置一般只对当前插件有效,对主项目一般无影响。 例如plugin.cms.app.controller_suffix的值只影响插件的控制器后缀,对主项目没有影响。 例如plugin.cms.app.controller_reuse的值只影响插件是否复用控制器,对主项目没有影响。 例如plugin.cms.middleware的值只影响插件的中间件,对主项目没有影响。 例如plugin.cms.view的值只影响插件所使用的视图,对主项目没有影响。 例如plugin.cms.container的值只影响插件所使用的容器,对主项目没有影响。 例如plugin.cms.exception的值只影响插件的异常处理类,对主项目没有影响。

但是因为路由是全局的,所以插件配置的路由也是影响全局的。

获取配置

获取某个插件配置方法为 config('plugin.{插件}.{具体的配置}');,例如获取plugin/cms/config/app.php的所有配置方法为config('plugin.cms.app') 同样的,主项目或者其它插件都可以用config('plugin.cms.xxx')来获取cms插件的配置。

不支持的配置

应用插件不支持server.php,session.php配置,不支持app.request_classapp.public_pathapp.runtime_path配置。

数据库

插件可以配置自己的数据库,例如plugin/cms/config/database.php内容如下

  1. return [
  2. 'default' => 'mysql',
  3. 'connections' => [
  4. 'mysql' => [ // mysql为连接名
  5. 'driver' => 'mysql',
  6. 'host' => '127.0.0.1',
  7. 'port' => 3306,
  8. 'database' => '数据库',
  9. 'username' => '用户名',
  10. 'password' => '密码',
  11. 'charset' => 'utf8mb4',
  12. 'collation' => 'utf8mb4_general_ci',
  13. ],
  14. 'admin' => [ // admin为连接名
  15. 'driver' => 'mysql',
  16. 'host' => '127.0.0.1',
  17. 'port' => 3306,
  18. 'database' => '数据库',
  19. 'username' => '用户名',
  20. 'password' => '密码',
  21. 'charset' => 'utf8mb4',
  22. 'collation' => 'utf8mb4_general_ci',
  23. ],
  24. ],
  25. ];

引用方式为Db::connection('plugin.{插件}.{连接名}');,例如

  1. use support\Db;
  2. Db::connection('plugin.cms.mysql')->table('user')->first();
  3. Db::connection('plugin.cms.admin')->table('admin')->first();

如果想使用主项目的数据库,则直接使用即可,例如

  1. use support\Db;
  2. Db::table('user')->first();
  3. // 假设主项目还配置了一个admin连接
  4. Db::connection('admin')->table('admin')->first();

提示 thinkorm也是类似的用法

Redis

Redis用法与数据库类似,例如 plugin/cms/config/redis.php

  1. return [
  2. 'default' => [
  3. 'host' => '127.0.0.1',
  4. 'password' => null,
  5. 'port' => 6379,
  6. 'database' => 0,
  7. ],
  8. 'cache' => [
  9. 'host' => '127.0.0.1',
  10. 'password' => null,
  11. 'port' => 6379,
  12. 'database' => 1,
  13. ],
  14. ];

使用时

  1. use support\Redis;
  2. Redis::connection('plugin.cms.default')->get('key');
  3. Redis::connection('plugin.cms.cache')->get('key');

同样的,如果想复用主项目的Redis配置

  1. use support\Redis;
  2. Redis::get('key');
  3. // 假设主项目还配置了一个cache连接
  4. Redis::connection('cache')->get('key');

日志

日志类用法也与数据库用法类似

  1. use support\Log;
  2. Log::channel('plugin.admin.default')->info('test');

如果想复用主项目的日志配置,直接使用

  1. use support\Log;
  2. Log::info('日志内容');
  3. // 假设主项目有个test日志配置
  4. Log::channel('test')->info('日志内容');

应用插件安装与卸载

应用插件安装时只需要将插件目录拷贝到{主项目}/plugin目录下即可,需要reload或restart才能生效。 卸载时直接删除{主项目}/plugin下对应的插件目录即可。