完成架構搭建 — iBrand Laravel API 0.5

重要通知: Laravel + 小程序的開源電商版本源碼已經在 github 上拉,歡迎提交 issue 和 star :)
開源電商 Server 端: Laravel API源碼
開源電商 client 端:小程序源碼

iBrand 系統在搭建的時候,最注重的就是可複用性,但願經過產品+項目的方式積累下來的代碼可以重複使用在不一樣類型的項目上,因此咱們把公用的功能都獨立成 packagephp

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

圖片描述

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

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

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

安裝 wikimedia/composer-merge-plugin

咱們須要依賴 wikimedia/composer-merge-plugin 工具包,經過composer 安裝github

composer require wikimedia/composer-merge-plugin

添加模塊

在開發階段全部的模塊都放在 modules 文件夾下,所以須要在項目根目錄新建 modules 文件夾。web

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

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

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": "ibrand.shjchen@foxmail.com"
    }
  ],
  "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 文件夾下。segmentfault

識別模塊

合併 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 基礎開發方式
相關文章
相關標籤/搜索