asseco-voice/laravel-remote-relations

Laravel支持在微服务之间建立关系

v5.2.0 2024-03-27 14:38 UTC

README

Laravel远程关系

此包允许从Eloquent模型在本地创建与远程服务的关联关系。

安装

通过composer安装包。它自动注册为Laravel服务提供者,因此不需要额外的操作。

composer require asseco-voice/laravel-remote-relations

设置

  1. 运行 php artisan migrate 以迁移表。

表包含

  1. 本地模型类型/ID - 本地Eloquent模型的多态关系
  2. 服务 - 指示需要映射到特定服务类的键
  3. 远程模型 - 表示远程服务中模型的普通字符串(不是Laravel特定的)
  4. 远程模型ID - 创建关系的实际ID
  5. 已确认 - 用于验证是否创建了反向关系的日期

默认情况下,没有注册任何服务,因为该包不知道从哪里获取相关数据,所以您需要手动提供服务。

  1. 使用 php artisan vendor:publish --tag=asseco-remote-relations-config 发布配置
  2. 为您想建立关系的远程服务创建一个新的服务类,并使其扩展 HasRemoteRelations 接口
  3. 接口包含2个方法,负责解析单个关系或一系列关系。
  4. 解析集合始终在单个模型类型(例如,单个用户集合)和单个服务上执行,以便您可以在可能的情况下一次性解析多个模型。
  5. 模型ID是 string 类型,因此它也支持非数字ID。
  6. 将类添加到配置中的 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

扩展包

发布配置将允许您更改包模型,以及控制迁移的行为。如果扩展模型,请确保在实现中扩展了原始模型。