DSSHOP 插件

2022-03-18 17:49 更新

為什么使用插件

  • 去耦合

解耦后的插件雖然在安裝的時候會有些繁瑣,但更容易升級、個性化定制

  • 通用性

插件將盡可能的往通用性設計,即插件的設計不會只針對商城

常見問題

  • 為什么不采用自動化部署?

自動化必然存在高耦合,可維護性差的問題,不利于項目發(fā)展

  • 插件是否收費?

插件是否收費由插件開發(fā)者決定,一般可直接下載的均可免費使用

  • 為什么我的觀察者沒有被執(zhí)行?

請確保正確配置了?$route?,只有存在于?$route?的路由,才會執(zhí)行當前的觀察者;還有一種可能就是你的監(jiān)聽并不是http請求,而是控制器觸發(fā)(調度任務),那么你需要在判斷中加入控制器的判斷代碼。

  • 為什么我的觀察者被執(zhí)行了多次?

往往被執(zhí)行多次是因為你并沒有做到很好的約束,請加大限制條件,確保只在需要執(zhí)行的步驟中觸發(fā)。

觀察者模式

  • 首先在?app/Observers?目錄下創(chuàng)建觀察者,一般先創(chuàng)建一個目錄,目錄名根據(jù)取模型名,如?GoodIndent?,再創(chuàng)建一個?Observers?,命名以實際功能命名,如?IndentFailureStockProcessingObserver?,這個觀察者的作用是訂單失效庫存操作
  • 其次就是在?Providers/AppServiceProvider.php?的?boot?方法中,將定義的觀察者添加進來,如
public function boot()
{
    \App\Models\v1\GoodIndent::observe(\App\Observers\GoodIndent\IndentFailureStockProcessingObserver::class);
}

什么時候下需要使用觀察者模式

  • 當你的代碼存在耦合性的時候,就可以將耦合代碼拆分成觀察者模式
  • 當你的插件需要修改項目源代碼時,可以使用觀察者模式,這樣可以確保項目更新后不會引響到自己添加的代碼

示例代碼:

<?php

namespace App\Observers\GoodIndent;

use App\Models\v1\Dhl;
use App\Models\v1\GoodIndent;
use App\Models\v1\User;
use App\Notifications\InvoicePaid;
use Illuminate\Http\Request;

/**
 * finish payment
 * 發(fā)貨通知
 * Class ShipmentNotificationObserver
 * @package App\Observers\GoodIndent
 */
class ShipmentNotificationObserver
{
    protected $request;
    // 這里配置需要執(zhí)行該觀察者的路由
    protected $route = [
        'admin/indent/shipment'
    ];
    // 是否執(zhí)行觀察者,默認為不執(zhí)行,只有路由存在于$route時才會觸發(fā),并且在非http請求時不會觸發(fā)
    protected $execute = false;

    public function __construct(Request $request)
    {
        if (!app()->runningInConsole()) {
            $this->request = $request;
            $path = explode("admin", $request->path());
            
            if (count($path) == 2) {
                $name = 'admin' . $path[1];
                // $name = 'admin' . preg_replace("/\/\\d+/",'', $path[1]);
            } else {
                $path = explode("app", $request->path());
                $name = 'app' . $path[1];
                //$name = 'app' . preg_replace("/\/\\d+/",'', $path[1]);
            }
        }
        if (collect($this->route)->contains($name)) {
            $this->execute = true;
        }
    }

    public function updated(GoodIndent $goodIndent)
    {
        // 當通過http請求,并存在于$route配置的路由時才觸發(fā),或是控制器觸發(fā)(Console)
        if (($this->execute || app()->runningInConsole()) && $goodIndent->state == GoodIndent::GOOD_INDENT_STATE_TAKE) {
            
        }
    }
}

插件使用說明

  • sshop v1.1.0開始支持插件
  • 插件以獨立項目發(fā)布,由獨立個體維護(前期為Dsshop開發(fā)者發(fā)布和維護)

結構

.
├── list    //插件
│   ├── coupon
│   │   ├── admin //后臺資源
│   │   │   ├── api  //后臺api
│   │   │   └── views    //后臺模板
│   │   ├── api //API資源
│   │   │   ├── config  //配置資源
│   │   │   ├── console //任務調度資源
│   │   │   ├── models  //模型資源
│   │   │   ├── observers  //觀察者資源
│   │   │   ├── plugin  //插件資源
│   │   │   │   ├── admin //后臺API
│   │   │   │   ├── client //客戶端API
│   │   │   └── requests    //表單驗證資源
│   │   ├── database    //數(shù)據(jù)表資源
│   │   ├── client  //客戶端
│   │   │   ├── nuxt-web  //網(wǎng)站
│   │   │   └── uni-app   //app
│   │   ├── dsshop.json //插件配置
│   │   ├── routes.json //路由配置
│   │   ├── diff.json //沖突記錄
├── template    //插件生成文件所需的模板
└── dsshop.json    //本地插件配置

dsshop.json

  • 本地安裝的插件列表,用于管理本地插件的安裝和更新,格式為
[
  {
    "name": "coupon", // 插件包名
    "versions": "",  //插件版本
    "is_delete": "",  //是否卸載
    "time":""  //插件安裝時間
  }
  ...
]

coupon

  • 這里以優(yōu)惠券插件為例,如果你創(chuàng)建的插件,可以自己命名

coupon/dmin

  • 插件后臺資源,包含 ?api ??views?
api //后臺的api配置
views //后臺的模板

coupon/api

  • 插件API相關資源,也就是php相關資源,包含以下目錄,目錄下可為空
config //配置文件,如果有配置相關的,推薦添加以插件名稱命名的配置文件,對應的路徑 `api/config`
console //定時任務相關(需要LINUX支持),對應的路徑 `api/app/Console`
models  //模型相關資源,對應的路徑 `api/app/Models/v1`
plugin  //插件相關控制器,對應的路徑 `api/app/Http/Controllers/v1/Plugin`
requests //表單驗證相關控制器,對應的路徑 `api/app/Http/Requests/v1`
observers //觀察者相關代碼,對應的路徑 `api/app/Observers`

coupon/database

  • 數(shù)據(jù)遷移資源,和插件相關的數(shù)據(jù)表都會以遷移文件形式存在,需要在終端運行
php artisan migrate

coupon/uniApp

  • uni-app相關資源,該目錄下分 ?api ??components ??pages?三個目錄,沒有的目錄下可為空
api //插件和后端通信所需的API文件
components  //插件在uni-app下的組件(插件必須以組件的形式存在于uni-app,可以理解為vue下的插件)
pages //插件對應的模板

coupon/dsshop.json

  • 這里的dsshop.json是 ?coupon?插件目錄下的配置文件
{
   "name": "優(yōu)惠券",  //插件名稱
   "abbreviation": "coupon",  //插件縮寫
   "img": "",  // 插件縮略圖
   "describe": "支持創(chuàng)建滿減、隨機、折扣優(yōu)惠券",  //插件描述
   "url": "",  //插件地址
   "versions": "0.0.1", //插件版本
   "author": "", //插件作者
   "author_url": "", //作者空間地址
   "portrait": "", //作者頭像
   "category": 0, //類型,當前只有插件,故值為0
   "instructions": "", //插件說明,將在下載時自動生成README.md
   "local": 1, //是否本地環(huán)境,自己創(chuàng)建的插件會為1
   "publish": 1, //是否已發(fā)布,發(fā)布后的插件可以安裝和卸載
   "state": 0, //狀態(tài):0未下載1已下載2已安裝3已卸載
}

coupon/routes.json

  • 路由配置文件,該文件保存了后臺、API、app所有涉及到路由配置的地方,格式參考如下
{
  "admin": "",  // 后臺API路由,將會自動添加到 api/routes/api.php里面
  "permission": "",  //后臺模板路由,將會自動添加到 admin/src/store/permission.js里面
  "app": " ", // APP路由,將會自動添加到 api/routes/api.php里面,這里是需要用戶登錄權限驗證的
  "notValidatedApp": " ", // APP路由,將會自動添加到 api/routes/api.php里面,這里是不需要驗證用戶登錄狀態(tài)的
  "observers": "",  //觀察者路由,將會自動添加到 api/app/Providers/AppServiceProvider的boot里面
  "wechatChannel": "",  //微信公眾號模板消息 api/app/Channels/WechatChannel.php
  "routeLangAdmin":"",   //路由語言包,用于插件獲取后臺路由所用 api/resources/lang/zn/route.php
  "routeLangClient":"",   //路由語言包,用于插件獲取app路由所用 api/resources/lang/zn/route.php
  "relyOn":[],   //依賴的插件
  "relevance":[],   //關聯(lián)的文件
  "clientTemplate":[],   //關聯(lián)的客戶端模板列表
  "adminTemplate":[],   //關聯(lián)的后臺模板列表
  "packagingJurisdiction":[],   //權限列表
  "db": [], //生成的數(shù)據(jù)列表
}

插件開發(fā)模式

  • 默認每個插件的?publish?分支為插件的開發(fā)模式下的代碼,如果插件是開源的,都應該提供該分支
  • 開發(fā)模式下,需要先進行編輯,然后將每個表的“是否重置”勾選,再將“重置路由”勾選,保存后項目將自動添加插件相關文件,通過發(fā)行后,自動將插件代碼抽離出項目放到插件對應的目錄下,再點下載,將插件部分文件打包出來
  • 只有在開發(fā)模式下允許進行插件的個性化修改,修改后,請根據(jù)上面一步有選擇性的對修改后的表或文件進行重置操作
  • 使用別人的開發(fā)模式代碼,請不要使用第二步操作,可進行一次插件安裝,然后將開發(fā)模式下的?dsshop.json?替換,即會自動切換到開發(fā)模式

插件開發(fā)

  • 首先請確保你已經了解插件的結構
  • 你想開發(fā)的插件是無耦合的,且可擴展的
  • 插件開發(fā)中,如果添加了其它文件,可添加到相關文件
  • 插件升級不建議針對之前版本的文件有刪除操作,如果涉及到數(shù)據(jù)表的修改,請用遷移文件的形式進行處理

第一步

  • 根據(jù)自己的想法,開發(fā)功能模塊,包括且不限于:模型、控制器、驗證器、后臺模板、uni-app模板、uni-app組件等等

第二步:解耦

  • 解耦就是將一些和插件有關的代碼分離出來,并根據(jù)插件開發(fā)的結構進行歸類(如果是在原有項目添加的代碼不需要分離,請先保留)

第三步:數(shù)據(jù)遷移

  • 將數(shù)據(jù)表轉為數(shù)據(jù)遷移代碼,如是基于原有表的,也需要轉為數(shù)據(jù)遷移代碼

第四步:提取權限

  • 將插件相關的權限按下表進行填寫
權限名稱 API 分組 菜單圖標 顯示在菜單欄
優(yōu)惠券 Coupon 工具

第五步:編寫示例代碼

  • 編寫示例代碼,為了利于維護,可直接截圖標注,不要提供耦合示例代碼

第六步:編寫插件安裝json

{
   "name": "優(yōu)惠券",  //插件名稱
   "abbreviation": "coupon",  //插件縮寫
   "describe": "支持創(chuàng)建滿減、隨機、折扣優(yōu)惠券",  //插件描述
   "download": "",  //插件下載地址
   "url": "",  //插件地址
   "versions": "0.0.1", //插件版本
}

第七步:測試

  • 下載最新版本的dsshop,根據(jù)插件安裝流程,安裝自己的插件,看最終是否可以正常安裝、使用和卸載


以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號