完成架构搭建 — iBrand Laravel API 0.5

重要通知: Laravel + 小程序的开源电商版本源码已经在 github 上拉,欢迎提交 issue 和 star :)

开源电商 Server 端: Laravel API源码

开源电商 client 端:小程序源码

iBrand 系统在搭建的时候,最注重的就是可复用性,希望通过产品+项目的方式积累下来的代码能够重复使用在不同类型的项目上,所以我们把公用的功能都独立成 package

本教程就是基于目前商用的 iBrand 新零售系统抽离出来的,通过一个截图我们来看目前商用系统的架构设计。

《完成架构搭建 — iBrand Laravel API 0.5》

每一个 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": "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 文件夹下。

识别模块

合并 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 的踪影。

《完成架构搭建 — iBrand Laravel API 0.5》

小结

在后续的教程中,我们将不断使用这种方式把各个 modules 添加到我们的项目中来,通过 composer 再加上程序设计(继承、多态) 将尽量提高代码的复用性,远离复制粘贴 : )

本章小知识点:

  • 了解 iBrand 项目基础架构
  • 学习 composer.json 的基本使用
  • 了解 module/package 基础开发方式
    原文作者:iBrand
    原文地址: https://segmentfault.com/a/1190000014830550
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞