解耦后的插件雖然在安裝的時候會有些繁瑣,但更容易升級、個性化定制
插件將盡可能的往通用性設計,即插件的設計不會只針對商城
自動化必然存在高耦合,可維護性差的問題,不利于項目發(fā)展
插件是否收費由插件開發(fā)者決定,一般可直接下載的均可免費使用
請確保正確配置了?$route?,只有存在于?$route?的路由,才會執(zhí)行當前的觀察者;還有一種可能就是你的監(jiān)聽并不是http請求,而是控制器觸發(fā)(調度任務),那么你需要在判斷中加入控制器的判斷代碼。
往往被執(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) {
}
}
}
.
├── 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 //本地插件配置
[
{
"name": "coupon", // 插件包名
"versions": "", //插件版本
"is_delete": "", //是否卸載
"time":"" //插件安裝時間
}
...
]
api
??views
?api //后臺的api配置
views //后臺的模板
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`
php artisan migrate
api
??components
??pages
?三個目錄,沒有的目錄下可為空api //插件和后端通信所需的API文件
components //插件在uni-app下的組件(插件必須以組件的形式存在于uni-app,可以理解為vue下的插件)
pages //插件對應的模板
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已卸載
}
{
"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ù)列表
}
publish
?分支為插件的開發(fā)模式下的代碼,如果插件是開源的,都應該提供該分支dsshop.json
?替換,即會自動切換到開發(fā)模式權限名稱 | API | 分組 | 菜單圖標 | 顯示在菜單欄 |
---|---|---|---|---|
優(yōu)惠券 | Coupon | 工具 | 否 | 是 |
{
"name": "優(yōu)惠券", //插件名稱
"abbreviation": "coupon", //插件縮寫
"describe": "支持創(chuàng)建滿減、隨機、折扣優(yōu)惠券", //插件描述
"download": "", //插件下載地址
"url": "", //插件地址
"versions": "0.0.1", //插件版本
}
更多建議: