dandysi/laravel-monorepo

一套工具,使处理相关Laravel微服务的monorepo工作变得更加容易

v1.0.0 2024-01-02 19:19 UTC

This package is auto-updated.

Last update: 2024-09-13 13:29:24 UTC


README

Actions Status

此包允许您创建相关Laravel微服务的monorepo,这些微服务共享公共库和后端服务/技术。

演示

使用此包包含三个相关Laravel微服务的演示仓库。

https://github.com/dandysi-labs/demo-laravel-monorepo

安装

composer require dandysi/laravel-monorepo

创建提供者

如果您打算使用正常的Laravel目录结构

php artisan make:monorepo-provider Chores

这将创建具有 App\Chores 命名空间的文件 app/Chores/MonorepoProvider.php

在正常范围之外,您需要指定目标目录(这将相对于项目根目录)

php artisan make:monorepo-provider Chores microservices/Chores

这将创建具有 Chores 命名空间的文件 microservices/Chores/MonorepoProvider.php

...并相应地更新您的 composer.json 自动加载路径

"autoload": {
    "psr-4": {
        "Chores\\": "microservices/Chores"
    }
}

下一步

像平常一样编写代码,但使用monorepo提供者来设置服务。

路由

像往常一样添加路由(如果已经缓存了路由,则不会调用此函数)。

use Illuminate\Support\Facades\Route;

protected function configureRoutes()
{
    Route::middleware('api')
        ->prefix('api')
        ->group(__DIR__ . '/routes.php')
    ;
}

命令

注册命令类。

use Chores\Console\ExpireArticlesCommand;

protected function registerCommands(): array
{
    return [
        ExpireArticlesCommand::class
    ];
}

定时任务

use Illuminate\Console\Scheduling\Schedule;

protected function registerSchedule(Schedule $schedule): void
{
    $schedule->command(ExpireArticlesCommand::class)->daily();
}

事件

注册事件监听器

protected function registerEventListeners(): array
{
    return [
        ArticleCreated::class => [
            UpdateArticleCachListener::class
        ],    
        ArticleDeleted::class => [
            UpdateArticleCachListener::class
        ]
    ];
}

注册事件订阅者

protected function registerEventSubscribers(): array
{
    return [
        UpdateArticleCacheSubscriber::class
    ];
}

配置

要包含隔离的配置数据(如果已缓存配置,则不会调用此函数)

protected function registerConfig(): array
{
    return [
        'chores' => require __DIR__ . '/config.php'
    ];
}

但是,如果您想进一步调整正常配置文件,而不仅仅是更新环境变量,请将现有值(必须是最基础的类,并且方法必须以 Config 结尾)包裹在函数调用中

// config/database.php
use Dandysi\Laravel\Monorepo\MonorepoProvider;

return [
    'connections' => MonorepoProvider::dbConnectionsConfig([
        'sqlite' => [
            'driver' => 'sqlite',
            'url' => env('DATABASE_URL'),
            'database' => env('DB_DATABASE', database_path('database.sqlite')),
            'prefix' => '',
            'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true),
        ]
    ])
];

...并在monorepo提供者中创建一个函数来执行修改

// microservices/Chores/MonorepoPrvider.php

public static function dbConnectionsConfig(array $default): array
{
    $default['new_db'] => [
        // ...
    ];

    return $default;
}

测试

由于路由、配置、命令、定时任务和事件都是隔离的,因此测试稍微复杂一些。但是,还有一个make命令可以帮助。这将为您生成一个测试用例,以便在测试中扩展,从而设置相关的微服务。

php artisan make:monorepo-test-case Chores/Tests microservices/Chores/Tests Chores

这将创建文件 microservices/Chores/Tests/TestCase.php,具有命名空间 Chores\Tests,并使用 Chores\MonorepoProvider

使用

要使用您的新微服务,只需将环境变量 MONOREPO_PROVIDER 更改为指向相关的monorepo提供者类

MONOREPO_PROVIDER=Chores\\MonorepoProvider

要快速运行命令,请在命令前加上env

MONOREPO_PROVIDER=Chores\\MonorepoProvider php artisan chores:some_command

或提供一些路由

MONOREPO_PROVIDER=Chores\\MonorepoProvider php artisan serve

其他提供者

只需创建一个新的提供者并重复。

许可证

开源软件,根据 MIT 许可证 授权。