asseco-voice / laravel-remote-relations
Laravel支持在微服务之间建立关系
Requires
- php: ^8.1
- asseco-voice/laravel-common: ^3.0
- laravel/framework: ^10.0
Requires (Dev)
- fakerphp/faker: ^1.9.1
- mockery/mockery: ^1.4.4
- orchestra/testbench: ^8.5
- phpunit/phpunit: ^10.0
README
Laravel远程关系
此包允许从Eloquent模型在本地创建与远程服务的关联关系。
安装
通过composer安装包。它自动注册为Laravel服务提供者,因此不需要额外的操作。
composer require asseco-voice/laravel-remote-relations
设置
- 运行
php artisan migrate
以迁移表。
表包含
- 本地模型类型/ID - 本地Eloquent模型的多态关系
- 服务 - 指示需要映射到特定服务类的键
- 远程模型 - 表示远程服务中模型的普通字符串(不是Laravel特定的)
- 远程模型ID - 创建关系的实际ID
- 已确认 - 用于验证是否创建了反向关系的日期
默认情况下,没有注册任何服务,因为该包不知道从哪里获取相关数据,所以您需要手动提供服务。
- 使用
php artisan vendor:publish --tag=asseco-remote-relations-config
发布配置 - 为您想建立关系的远程服务创建一个新的服务类,并使其扩展
HasRemoteRelations
接口 - 接口包含2个方法,负责解析单个关系或一系列关系。
- 解析集合始终在单个模型类型(例如,单个用户集合)和单个服务上执行,以便您可以在可能的情况下一次性解析多个模型。
- 模型ID是
string
类型,因此它也支持非数字ID。 - 将类添加到配置中的
services
键下,格式为'service_name' => Service::class'
使用
让模型使用 Relatable
特性,这将提供Eloquent关系到 RemoteRelation
类,这样您就不需要重复操作。
还有一些实用的方法
relate($service, $model, $id)
- 创建关系relateQuietly($service, $model, $id)
- 创建关系,抑制通常由关系创建引发的全部事件。unrelate($service, $model, $id)
- 删除关系unrelateQuietly($service, $model, $id)
- 删除关系,抑制通常由关系创建引发的全部事件。
CRUD API
标准API资源已发布在 api/remote-relations
端点,带有标准CRUD路由。
在 api/remote-relations/many
上,您可以执行POST请求一次存储多个关系。
此外,还有一个 GET
api/remote-relations/{remote_relation}/resolved
端点,它将返回一个解析后的关系。
确认
最初,当您从服务A创建到服务B的远程关系时,已确认属性是 null
。当服务B捕获事件并在其数据库中创建关系时,它应将新创建的行的已确认属性设置为 true
,并将其通信回服务A以将原始关系的已确认属性设置为 now()
。
程序化解析关系
你可能需要一个知道如何解决特定关系的类。为此,让您的SDK类实现HasRemoteRelations
接口并实现其中的方法。
完成这些后,在services.php
中的sdk
键下注册该类。服务名称必须是您在填充service
属性时存储在数据库中的名称。
示例
假设在services.php
中有以下配置
'some_remote_service' => [
'sdk' => SomeRemoteService::class,
],
将Relatable
特质添加到您的User
模型中。
现在,您可以对单个用户实例调用relate()
方法,如下所示
$user->relate('some_remote_service', 'model_on_your_remote_service', 'id_of_a_model_on_your_remote_service');
请注意,第一个参数等于配置中的服务键。这就是包知道使用哪个服务的方式。
解决关系可以是单个关系,也可以是一组关系。
$user->remoteRelations->first()->resolve() // resolves a single relation
$user->remoteRelations->resolve() // resolves a relation collection
扩展包
发布配置将允许您更改包模型,以及控制迁移的行为。如果扩展模型,请确保在实现中扩展了原始模型。