Skip to content

说明

功能开发流程

明白需求 --> 拆分功能点 (整理逻辑) --> 写代码 --> 完成功能

模块文件树

├── configurations       # 配置文件
│   ├── permissions.yaml
├── docs                 # 技术文档
├── resources            # 资源文件
│   ├── config           # 发布的配置文件
│   ├── lang             # 多语言支持包的位置
│   │   └── zh
│   ├── mixes            # mixs : 混杂的文件
│   │   └── poppy        # poppy 核心包 (普通页面布局)
│   │       └── backend
│   ├── scss             # sass 预处理文件 (普通页面布局需要)
│   │   ├── backend
│   │   ├── basic
│   │   └── develop
│   └── views            # 视图文件
│       ├── backend      # 视图 - 后台
│       ├── develop      # 视图 - 开发者平台
│       ├── email        # 视图 - email
│       └── tpl          # 视图 - 核心模板
├── src
│   ├── action           # action
│   ├── backend          # 后端模块管理
│   ├── classes          # 基础类
│   │   ├── auth         # 权限
│   │   │   ├── guard    # 权限 - guard
│   │   │   └── provider # 权限 - provider
│   │   ├── payment      # 支付
│   │   └── traits       # traits
│   ├── commands         # 命令
│   ├── database         # 数据库
│   │   ├── factories    # 数据库 - 工厂
│   │   ├── migrations   # 数据库 - migrations
│   │   └── seeds        # 数据库 - 种子
│   ├── events           # 事件, 事件使用 Event 后缀
│   ├── extension        # 扩展包管理(开发用, 以后可能会废弃掉)
│   ├── http             # 路由和中间件
│   │   ├── middleware
│   │   └── routes
│   ├── listeners        # 事件 - 监听器
│   ├── mail             # 邮件
│   ├── models           # 模型
│   │   ├── filters      # 模型 - 过滤器
│   │   ├── policies     # 模型 - 策略
│   │   └── resources    # 模型 - 资源
│   ├── module           # 模块
│   │   ├── listeners
│   │   └── repositories
│   ├── notifications    # 通知
│   ├── permission       # 权限
│   │   ├── commands
│   │   ├── exceptions
│   │   ├── middlewares
│   │   └── repositories
│   ├── rbac             # rbac 角色包
│   │   ├── contracts
│   │   ├── facades
│   │   ├── helper
│   │   ├── middleware
│   │   └── traits
│   ├── request          # 控制器
│   │   ├── api_v1       # 控制器 - Api
│   │   │   ├── backend
│   │   │   ├── pam
│   │   │   └── util
│   │   ├── backend      # 后端页面
│   │   ├── develop      # 开发平台
│   │   └── system       # 后台系统入口
│   └── setting          # 系统设置
└── tests                # 单元测试

注册服务

<?php namespace Poppy\System;

/**
 * 定义模块名称
 * 模块可以使用 module.{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,
        ...
        Permission\Commands\PermissionCommand::class,
    ]);
}

// config 覆盖
private function bootConfigMail()
{
    config([
        'mail.driver'       => sys_setting('system::mail.driver') ?: config('mail.driver'),
    ]);
}

验证

1.语言包
 - resource/lang/zh/validator.php
2.相应的验证规则
 - Rule 类
3.FrameworkServiceProvider.php 验证正则规则

设置

设置使用 Form Setting 来进行设置, 详细见 Form 部分

模块约定

缓存

缓存 Key 命名

缓存 Key 放置在模型/Action 的常量中, 命名规范是

CK_{Key}

Key : 命名的标识

缓存命中命名

缓存命中包含 Atomic / Funnel 这种, 缓存命中放置在 Redis(0) 仓库中, 命名规范为

prefix:redis:{function tag}:{key}

function tag : 功能标签, 用来进行文件夹区分 key : 唯一标识符