Appearance
说明
模块是开发的基础组成部分, 各个项目都是有多个不同的模块组合而成, 模块是组件模的子单元
创建
使用如下命令来创建模块, 创建的模块如下树状结构
$ php artsian poppy:make {slug} -Q
在模块创建完成后会在模块的根目录下创建一个 manifest.json
文件, 用来对项目中的模块进行加载
json
{
"name": "系统",
"slug": "system",
"version": "1.1",
"order": 10,
"description": "Core Support Module For Basic Pam"
}
这里的 order
是对于模块进行排序的, 该项目可以控制模块中间菜单的顺序, 模块的加载顺序, 如果要调整各个模块菜单的加载顺序可以通过此参数进行调整, 排序规则 : 递增
配置
模块配置文件 : config/module.php
模块配置依据模块命名进行设置
php
return [
'module1' => [
'some-config': true
],
//...
'module2' => [
'some-config': true
],
],
文件树
├── configurations # 配置文件
│ ├── permissions.yaml # 权限定义
│ ├── menus.yaml # 菜单定义
│ ├── services.yaml # 服务定义文件
│ ├── hooks.yaml # 服务钩子定义文件
├── docs # 技术文档
├── resources # 资源
│ ├── config # 发布的配置文件
│ ├── lang # 多语言支持包的位置
│ │ └── zh
│ └── views # 视图文件
│ ├── backend # 视图 - 后台
│ ├── develop # 视图 - 开发者平台
│ ├── email # 视图 - email
│ └── tpl # 视图 - 核心模板
├── src
│ ├── Action # 业务逻辑文件
│ ├── Classes # 基础类
│ │ ├── Auth
│ │ ├── {Model}Def.php # 模块定义文件
│ │ └── Traits # traits
│ ├── Commands # 命令
│ ├── Events # 事件, 事件使用 Event 后缀
│ ├── Http # 路由和中间件
│ │ ├── Request # 控制器
│ │ ├── Middleware # 中间件
│ │ └── Routes # 路由
│ ├── Listeners # 事件 - 监听器
│ ├── Models # 模型
│ │ ├── Policies # 模型 - 策略
│ │ └── Resources # 模型 - 资源
│ └── Notifications # 通知
└── tests # 单元测试
注册服务
php
<?php
declare(strict_types = 1);
namespace Demo;
use Poppy\Framework\Support\PoppyServiceProvider;
use Poppy\System\Events\PassportVerifyEvent;
class ServiceProvider extends PoppyServiceProvider
{
/**
* 定义模块名称
* 模块使用 module.{module}
*/
protected $name = 'poppy.system';
// 注册事件监听器
protected $listens = [
\Illuminate\Auth\Events\Failed::class => [
Listeners\AuthFailed\LogListener::class,
],
];
// 注册策略
protected $policies = [
PamRole::class => PamRolePolicy::class,
PamAccount::class => PamAccountPolicy::class,
];
/**
* 启动
*/
public function boot()
{
parent::boot($this->name);
// 注册 api 文档配置
$this->publishes([
__DIR__ . '/../resources/config/sami.php' => storage_path('sami/config.php'),
__DIR__ . '/../resources/config/module.php' => base_path('config/module.php'),
], 'poppy-module');
$path = poppy_path($this->name);
// 配置文件
$this->mergeConfigFrom($path . '/resources/config/module.php', 'module');
$this->bootConfigMail();
}
// 注册服务
public function register()
{
$this->app->register(Http\MiddlewareServiceProvider::class);
// ...
$this->app->register(Permission\PermissionServiceProvider::class);
$this->registerConsole();
$this->registerSchedule();
}
// 计划任务
private function registerSchedule()
{
app('events')->listen('console.schedule', function (Schedule $schedule) {
$schedule->command('py-system:user', ['auto_enable'])
->everyFiveMinutes()->appendOutputTo($this->consoleLog());
});
}
// 注册命令
private function registerConsole()
{
$this->commands([
Commands\UserCommand::class,
// ...
]);
}
// config 覆盖
private function bootConfigMail()
{
config([
'mail.driver' => sys_setting('system::mail.driver') ?: config('mail.driver'),
]);
}
}
其他约定
模块定义文件
模块定义文件一般放置在 {module}/src/Classes
目录下, 文件名称为 {Module}Def.php
, 用以放置项目中通用的缓存定义等通用型的定义数据的 name 值, 不包含 slug
, slug 在使用的时候定义
- 缓存KEY定义
- 错误码
php
<?php
declare(strict_types = 1);
namespace Demo\Classes;
class DemoDef
{
public static function ckDemoCache(string $key) : string
{
return 'demo_cache_'.$key;
}
}