Skip to content

模块后台

创建模块

创建模块请在后台 系统设置>模块设计 创建,系统会在 addons目录中创建模块,模块目录结构与Laravel是相似的,如果你会使用Laravel则没有使用难度。

image-20220709000306515

配置文件

模块配置文件存放于 config 目录中

  • config 模块基本信息
  • permission 权限配置

配置文件 config.php 中的 admin、front配置段会影响站点>扩展模块页面的按钮显示

image-20220711032239412

模型

创建的模型文件请继承 Addons\AddonModel ,会继承一些好用的方法,下面再进行一些说明

  • static::addGlobalScope(new SiteScope) 查询时会根据site过滤数据,要求路由中存在site参数
  • 你可以点开 Addons\AddonModel 文件查看继承的方法,我会在后期更新时添加其他好用的方法
<?php
namespace Addons\Blog\Models;

use Addons\AddonModel;
use App\Models\Scopes\SiteScope;
use Illuminate\Database\Eloquent\Factories\HasFactory;

class Article extends AddonModel
{
    use HasFactory;

    protected $table = 'hd_articles';

    protected $fillable = ['title', 'content', 'type'];

    protected static function booted()
    {
        static::addGlobalScope(new SiteScope);
    }

    protected static function newFactory()
    {
        return \Addons\Blog\Database\factories\ArticleFactory::new();
    }
}

路由

因为平台会有众多模块,为了在URL上进行区分,路由需要以模块名为前缀,建议使用以下方式声明路由。

  • 所有路由必须包含站点,所以下面的路由使用了 'site.article
  • 系统会根据site请求参数,对表的结果进行限制,即只查看当前站点数据,当然需要在模型中进行相关声明
<?php

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
use Addons\Blog\Controllers\ArticleController;

Route::prefix('Blog')->group(function () {
    Route::apiResource('site.article', ArticleController::class);
});

控制器

需要将默认生成的控制器继承 Addons\AddonController,这样会拥有 policysuccess等功能。

下面是一个控制器示例,有以下几个特点

  • 包含policy功能,对请求进行验证
  • 包含$this->success 等方法,用于响应结果
  • 分页列表不要使用 $this->success 方法响应结果
use Addons\Blog\Models\Article;
use Addons\Blog\Transformers\ArticleResource;
use Addons\AddonController;
use App\Models\Site;
use Illuminate\Http\Request;

class ArticleController extends AddonController
{
    public function __construct()
    {
        $this->middleware(['auth:sanctum'])->except(['index', 'show']);
        //进行policy验证,但对index不验证
        $this->authorizeResource(Article::class, 'article', ['except' => 'index']);
    }

    public function index(Site $site)
    {
        return ArticleResource::collection(Article::paginate(10));
    }

    public function store(Request $request, Site $site, Article $article)
    {
        $article->site()->associate($site);
        $article->fill($request->input())->save();

        return $this->success('文章添加成功', $article);
    }
		...
}

Policy

policy用于对请求进行验证,使用非常方便。但默认创建的Policy只有简单方法,你根据下表创建相应方法。

控制器方法策略方法
indexviewAny
showview
createcreate
storecreate
editupdate
updateupdate
destroydelete