完成架构搭建 — 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 基础开发方式
相关文章
相关标签/搜索