如何通過模組/外掛機制,靈活組織Laravel工程

做軟體的禪師發表於2020-11-23

如何通過模組/外掛機制,靈活組織Laravel工程

有時候我們需要把 Laravel 工程拆分成不同的模組或功能管理,可以分配不同的工程師負責不同的模組,也方便在不同的工程之間相互使用。

有一個nwidart/laravel-modules就是做為modules來管理的,但有些問題:

  1. 生成的包裡過於依賴 nwidart/laravel-modules,比如自動載入過程和 module_path 的函式依賴,造成生產環境也不能脫離,還有modules.json等一些囉嗦的多餘檔案。其實一點意義都沒有,因為包通過 Laravel Service Provider 標準管理即可。

  2. 目錄結構和laravel有些出入,比如Models,他起名叫 Entities。

  3. 比如用 make-command,生成的 Command 和 Laravel 腳手架的內容也不一樣,內容還有些囉嗦。

這個包解決了上面的問題,而且還可以製作標準的 composer package。

在我們實際專案裡一直作為模組的管理方式,也可以考慮做成動態的外掛機制。

安裝

composer require --dev zencodex/package-make

使用方法

// Modules/NewPackage
php artisan package:make NewPackage

目錄結構:

Modules/NewPackage
├── Config
│   └── config.php
├── Console
│   └── UserCommand.php
├── Database
│   ├── Migrations
│   ├── Seeders
│   │   └── NewPackageDatabaseSeeder.php
│   └── factories
├── Http
│   ├── Controllers
│   │   └── NewPackageController.php
│   ├── Middleware
│   ├── Requests
│   └── Resources
│       └── UserResource.php
├── Models
│   └── User.php
├── Providers
│   ├── NewPackageServiceProvider.php
│   └── RouteServiceProvider.php
├── Resources
│   ├── assets
│   │   ├── js
│   │   │   └── app.js
│   │   └── sass
│   │       └── app.scss
│   ├── lang
│   └── views
│       ├── index.blade.php
│       └── layouts
│           └── master.blade.php
├── Routes
│   ├── api.php
│   └── web.php
├── Tests
│   ├── Feature
│   └── Unit
├── composer.json
├── package.json
└── webpack.mix.js

專案裡使用方法

option 1:

// app/Providers/AppServiceProvider.php

use Modules\NewPackage\Providers\NewPackageServiceProvider;

class AppServiceProvider extends ServiceProvider

    public function register()
    {
        $this->app->register(NewPackageServiceProvider::class);
        ...
    }

or

Edit config/app.php, add Modules\NewPackage\Providers\NewPackageServiceProvider::class to providers.


    'providers' => [
        Illuminate\Validation\ValidationServiceProvider::class,
        Illuminate\View\ViewServiceProvider::class,
        Modules\NewPackage\Providers\NewPackageServiceProvider::class
        ...
    ],

option 2:

// 1. edit composer.json, add following
"repositories": [
    {
        "type": "path",
        "url": "Modules/*"
    }
]

// use private package or gitlab
"repositories": [
    {
        "type": "vcs",
        "url": "git@gitlab.example.com:/newpackage.git"
    }
]

// 2. composer require local path package (replace package/newpackage to yours)
composer require package/newpackage

其他可參考:

Github:package-make,喜歡就給個 star 哦

本作品採用《CC 協議》,轉載必須註明作者和本文連結
思考技術、產品,可加微信 zencodex 交流

相關文章