softonic/laravel-transactional-event-publisher

Softonic Laravel 事务性事件发布者


README

最新版本 软件许可 构建状态 覆盖率状态 质量评分 总下载量 解决问题的平均时间 仍未关闭的问题比例 Laravel 包,用于处理 Eloquent 模型操作和领域事件消息生成之间的原子性。

主要功能

  • 确保每个操作都通过 Eloquent 模型操作、事件生成和发送之间的原子事务发送领域事件。
  • 将事件异步或同步发送到 AMQP 系统。
  • 发送到目前为止所有事件的命令。

安装

您可以使用 composer 需求最新版本的包

composer require softonic/laravel-transactional-event-publisher

配置

您可以在 vendor/softonic/transactional-event-publisher/config/transactional-event-publisher.php 中配置基本 AMQP 信息。

如果您需要进一步定制,您可以将配置发布。

php artisan vendor:publish --provider="Softonic\TransactionalEventPublisher\ServiceProvider" --tag=config

我们提供 Softonic\TransactionalEventPublisher\EventStoreMiddlewares\DatabaseMiddlewareSoftonic\TransactionalEventPublisher\EventStoreMiddlewares\AmqpMiddleware 中间件来存储和发送事件。

数据库中间件

此中间件仅将事件存储在数据库的表中。如果您想将事件作为 REST 端点公开或检查事件历史记录,这可能会很有用。

要配置此中间件,您需要发布迁移

php artisan vendor:publish --provider="Softonic\TransactionalEventPublisher\ServiceProvider" --tag=migrations

并执行它们

php artisan migrate

AMQP 中间件

该中间件将事件发布到AMQP系统中。您只需使用配置文件或环境变量配置AMQP连接即可。如您所见,在配置中您无法定义队列。这是因为库只是将消息发布到交换机,而事件收集器的责任是声明所需的队列以及所需的绑定。

批量发布事件以提高性能

我们提供了一个命令来持续批量发布事件。您可以在 Softonic\TransactionalEventPublisher\Console\Commands\EmitEvents 中找到其签名。它将默认以100条事件为一批发布事件,或者您可以使用 --batchSize 选项来更改它。您只需创建一个无限运行的作业,使用命令 php artisan event-sourcing:emit

发送数据库中存储的所有事件

默认情况下,命令 php artisan event-sourcing:emit 将使用 MySQL无缓冲连接 发送数据库中存储的所有事件。否则,将使用MySQL缓冲连接从数据库中删除已发送的事件。

您可以使用 --dbConnection 选项指定要使用的缓冲连接,对于无缓冲连接使用 --dbConnectionUnbuffered。以下是从 config/database.php 中的无缓冲连接示例:

return [
    'connections' => [
        'mysql-unbuffered' => [
            'driver'      => 'mysql',
            'host'        => env('DB_HOST', '127.0.0.1'),
            'port'        => env('DB_PORT', '3306'),
            'database'    => env('DB_DATABASE', 'forge'),
            'username'    => env('DB_USERNAME', 'forge'),
            'password'    => env('DB_PASSWORD', ''),
            'unix_socket' => env('DB_SOCKET', ''),
            'charset'     => 'utf8',
            'collation'   => 'utf8_unicode_ci',
            'prefix'      => '',
            'strict'      => true,
            'engine'      => null,
            'options'     => [
                PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => false,
            ],
        ],
    ]
];

注册模型

要选择应发送领域事件的模型,您需要附加 \Softonic\TransactionalEventPublisher\ModelObserver 观察者类。

示例

...

use App\Models\Post as MyModel;
use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;
use Softonic\TransactionalEventPublisher\Observers\ModelObserver;

class EventServiceProvider extends ServiceProvider
{
    public function boot()
    {
        parent::boot();

        MyModel::observe(ModelObserver::class);
    }
    ...
}

自定义中间件

中间件应实现 Softonic\TransactionalEventPublisher\Interfaces\EventStoreMiddlewareInterface 接口。其目的是存储提供的领域事件,因此您可以为领域事件实现任何存储。

自定义消息

必须实现 transactional-event.messageBuilder 类以实现 EventMessageBuilderInterface,并且必须实现 transactional-event.middleware 类以实现 EventStoreMiddlewareInterface

构建器应返回一个 EventMessageInterface 值对象。它只需要实现具有所需所有属性的 toArrayjsonSerialize 方法。

注意事项

该软件包在以下Eloquent模型事件中开始数据库事务:

  • 创建
  • 更新
  • 删除

当事件存储中间件成功存储事件消息时,提交数据库事务。另一方面,如果事件存储无法存储事件消息,则对两个操作(Eloquent模型写入+事件消息存储)进行数据库回滚。请考虑如果在创建/更新/删除事件和创建/更新/删除之间发生错误,则事务将保持启动状态,直到连接关闭。

测试

softonic/laravel-transactional-event-publisher 有一个 PHPUnit 测试套件,以及一个使用 PHP CS Fixer 的编码风格合规性测试套件。

要从项目目录中运行测试,请运行以下命令。

$ make tests

要在开发环境中打开终端

$ make debug

许可证

Apache 2.0许可证。有关更多信息,请参阅 LICENSE