完成架構搭建 — iBrand Laravel API 0.5

iBrand 系統在搭建的時候,最注重的就是可複用性,希望通過產品+項目的方式積累下來的代碼能夠重複使用在不同類型的項目上,所以我們把公用的功能都獨立成 package

本教程就是基於目前商用的 iBrand 新零售系統抽離出來的,通過一個截圖我們來看目前商用系統的架構設計。

圖片描述

每一個 Component 都是獨立 package,我們通過 Composer 把它們組裝起來。目前我們通過 Satis 服務把這些 package 部署在我們私有服務器上。

使用 Satis 搭建私有的 Composer 包倉庫

本次教程我們也將繼續這種模式來進行敏捷迭代開發。

安裝 wikimedia/composer-merge-plugin

我們需要依賴 wikimedia/composer-merge-plugin 工具包,通過composer 安裝

composer require wikimedia/composer-merge-plugin

添加模塊

在開發階段所有的模塊都放在 modules 文件夾下,因此需要在項目根目錄新建 modules 文件夾。

接下來以添加一個 server 模塊爲例來演示模塊的添加,並且在下章 安裝 dingo API 會使用。

按照下面結構建立好相關文件和文件夾

api-tutorial-source
├── app
├── ...
└── modules
    └── server
        ├── LICENSE
        ├── README.md
        ├── composer.json
            ├── src
            │   └── Providers
            │       └── ServerServiceProvider.php
            └── tests

composer.json

Composer 基本用法
{
  "name": "ibrand/server",
  "type": "library",
  "description": "ibrand api server",
  "keywords": [
    "iBrand",
    "api",
    "server"
  ],
  "license": "MIT",
  "authors": [
    {
      "name": "shjchen",
      "email": "[email protected]"
    }
  ],
  "require": {
    "php": ">=7.0"
  },
  "autoload": {
    "psr-4": {
      "iBrand\\Server\\": "src/"
    }
  },
  "extra": {
    "laravel": {
      "providers": [
        "iBrand\\Server\\Providers\\ServerServiceProvider"
      ]
    }
  },
  "minimum-stability": "dev",
  "prefer-stable": true
}

ServerServiceProvider

每個module 至少包含一個 ServiceProvider,可以通過 Artisan 命令來新建

php artisan make:provider ServerServiceProvider

命令執行完畢後文件會默認創建在 app/Providers 下,我們剪貼到 modules/server/src/Providers 文件夾下。

識別模塊

合併 composer.json

打開項目的 composer.json 文件:

api-tutorial-source
├── app
├── ...
└── composer.json

找到 extra 添加 merge-plugin 內容如下:

"extra": {
        "laravel": {
            "dont-discover": [
            ]
        },
        "merge-plugin": {
            "include": [
                "modules/*/composer.json"
            ],
            "require": [
            ],
            "recurse": true,
            "replace": false,
            "ignore-duplicates": false,
            "merge-dev": true,
            "merge-extra": false,
            "merge-extra-deep": false,
            "merge-scripts": false
        }
    },

通過 include 指令把 server module 下的 composer.json 合並進來。這樣項目就能夠自動識別 server 包下的命名空間。

 "include": [
        "modules/*/composer.json"
      ],

執行 composer update --lock

註冊ServiceProvider

打開 config/app.php 文件 providers 數組添加

        /*
         * Package Service Providers...
         */

        iBrand\Server\Providers\ServerServiceProvider::class,

驗證

打開routes/web.php, 通過 dd(app()) 來看下 ServerServiceProvider 是否註冊成功

Route::get('/', function () {
    dd(app());
    return view('welcome');
});

chrome 打開 http://api.ibrand.test/ , 在 loadedProviders 數組中我們發現了 iBrand\Server\Providers\ServerServiceProvider 的蹤影。

圖片描述

小結

在後續的教程中,我們將不斷使用這種方式把各個 modules 添加到我們的項目中來,通過 composer 再加上程序設計(繼承、多態) 將盡量提高代碼的複用性,遠離複製粘貼 : )

本章小知識點:

  • 瞭解 iBrand 項目基礎架構
  • 學習 composer.json 的基本使用
  • 瞭解 module/package 基礎開發方式
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章