dandysi / laravel-monorepo
一套工具,使处理相关Laravel微服务的monorepo工作变得更加容易
Requires
- php: ^8.1
- illuminate/console: ^10.37
- illuminate/support: ^10.37
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.42
- orchestra/testbench: ^8.18
- phpstan/phpstan: ^1.10
- phpunit/phpunit: ^10.5
This package is auto-updated.
Last update: 2024-09-13 13:29:24 UTC
README
此包允许您创建相关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 许可证 授权。