idynsys/synced-module

此包最新版本(v0.1.4)没有提供许可证信息。

同步模型模块

安装: 830

依赖: 0

建议者: 0

安全: 0

星标: 1

关注者: 1

分支: 0

开放问题: 0

类型:laravel-module

v0.1.4 2023-10-01 19:33 UTC

This package is auto-updated.

Last update: 2024-09-30 01:16:36 UTC


README

安装

使用composer进行安装

composer req idynsys/synced-module
    1. 如果遇到依赖问题,需要使用-w选项:composer req idynsys/synced-module -W
    2. 为了使用此包,需要安装ext-kafka

安装(通用)

  1. 需要添加到app.php中

    Ids\Modules\Synced\Providers\SyncedServiceProvider::class

  2. 添加配置文件

    php artisan vendor:publish --tag=synced-config

  3. 然后运行php artisan vendor:publish --tag=laravel-kafka-config php artisan vendor:publish --provider="Ids\Modules\Synced\SyncedServiceProvider"

    之后,需要配置kafka.php(如果未配置或之前使用过mateusjunges/laravel-kafka)查看https://junges.dev/documentation/laravel-kafka/v1.8/3-installation-and-setup,需要添加到.env中的必要最小ENV变量

    KAFKA_BROKERS: localhost:9092 KAFKA_CONSUMER_GROUP_ID: 'group'

  • 在设置好代理并添加到.env后,需要确保kafka代理可通过网络访问(对于docker compose,需要设置共享网络)

添加模型以发送到kafka

  1. 为了添加模型,需要
    1. 添加SyncedModelInterface接口和特性(用于跟踪模型变化)
    2. 在构造函数中注册事件
    3. 实现方法
   public function getRouteKey(): string; //название маршрута (используется как основной топик)
   public function getSyncedAttributes(): array; // подготовленные данные к отправке в топик
   public function getTopics(): array; //дополнительные топики

其中RouteKey应确定实体的命名空间,SyncedAttributes应返回传递的数据数组,Topics是我们将用于传输的额外主题集合

完整示例

class User implements SyncedModelInterface
{
    use Synced;

    public function __construct(array $attributes = [])
    {
        parent::__construct($attributes);
        $this->registerSyncedListeners();
    }
    /**
     * route key of model
     */
    public function getRouteKey(): string
    {
        return 'user';
    }

    /**
     * prepare attributes to recieve
     */
    public function getSyncedAttributes(): array
    {
        return $this->toArray();
    }

    /**
     * additional topics 
     */
    public function getTopics(): array
    {
        return [];
    }
}

添加消费者以读取更改

  1. 为了在客户端接收更改,需要实现一个具有SyncedRepositoryInterface接口的仓库类
public function createByKafka(KafkaPublishData $data);
public function updateByKafka(KafkaPublishData $data);
public function deleteByKafka(KafkaPublishData $data);

createByKafka - 创建记录 updateByKafka - 更新 deleteByKafka - 删除

并在synced.php文件中配置仓库

    'repositories' => [
        'product' => 'App\Modules\Products\Repositories\ProductRepository',
        'organization' => 'App\Modules\Organizations\Repositories\OrganizationRepository',
        'application' => 'App\Modules\Applications\Repositories\ApplicationRepository',
    ],

接下来,只需运行以下命令启动消费者:

php artisan synced:consume:entity

  • 可以在synced.php中的command-signature参数更改命令名称