maslauskas/event-store

基于MySQL的Laravel简单事件存储

v0.1 2018-03-12 13:47 UTC

This package is auto-updated.

Last update: 2024-09-13 18:33:29 UTC


README

使用MySQL实现的Laravel简单事件存储实现包。

Build Status Latest Stable Version Total Downloads License

安装

要开始使用此包,请使用composer安装它

composer require maslauskas/event-store

发布配置和迁移

php artisan vendor:publish --provider=Maslauskas\EventStore\EventStoreServiceProvider

此包使用Laravel的包自动发现功能,因此不需要修改您的config/app.php文件。

配置

默认情况下,事件存储日志保存在主数据库中,但建议使用专门的MySQL数据库。一旦您创建了数据库,请确保将事件存储设置为使用它

首先,在您的config/database.php文件中添加一个专用连接

'connections' => [

        /*
        ...
        */

        'eventstore' => [
            'driver' => 'mysql',
            'host' => env('EVENT_STORE_HOST', 'localhost'),
            'port' => env('EVENT_STORE_PORT', '3306'),
            'database' => env('EVENT_STORE_DATABASE', 'event_store'),
            'username' => env('EVENT_STORE_USERNAME', 'root'),
            'password' => env('EVENT_STORE_PASSWORD', 'root'),
            'unix_socket' => env('DB_SOCKET', ''),
            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
            'prefix' => '',
            'strict' => true,
            'engine' => null,
        ],

        /*
        ...
        */
]

接下来,在您的.env文件中添加所需的环境变量

EVENT_STORE_CONNECTION="eventstore"
EVENT_STORE_DATABASE="your_event_store_database_name"
EVENT_STORE_TABLE="your_event_store_table_name"
EVENT_STORE_USERNAME="your_event_store_user_name"
EVENT_STORE_PASSWORD="your_event_store_user_password"

建议为事件存储数据库创建一个单独的用户,并删除UPDATE、DELETE、DROP权限,以确保事件存储只可追加。

接下来,运行迁移以创建默认事件存储表

php artisan migrate

用法

要开始记录事件,请将此行添加到您希望记录事件的代码中

EventStore::add('event_name', $data);

或者使用eventstore辅助函数,它只是门面包装器

eventstore()->add('event_name', $data);

add()方法接受四个参数

  • $event_type:您的事件名称,例如user_createdemail_sentorder_shipped等。
  • $payload:要记录的值的数组。例如,对于user_created事件,您可以传递创建用户时使用的属性数组。
  • $target_id(可选)数据库中目标模型的ID。例如,对于email_sent事件,您可以传递user_id作为$target_id。这有助于在将来您希望获取与特定用户相关的所有事件时。
  • $before(可选)已更改的值的数组。例如,对于user_updated事件,您可能传递$user->toArray()以记录更改的属性及其值。 注意: add()方法自动过滤出仅存在于$payload参数中的键,以避免不必要的开销。

有时,某些事件的发生频率比其他事件高得多,例如user_createduser_logged_in。为了帮助查询性能,您可以通过更改config/eventstore.php文件中的streams数组将某些事件分离到它们的专用表中。

'streams' => [
    'user_login_stream' => [
        'user_logged_in',
    ]
]

当您尝试添加user_logged_in事件时,这将在事件存储数据库中自动创建一个专门的user_login_stream表。未在此数组中定义的所有事件都将保存在默认事件存储表中。

额外方法

query()

返回Illuminate\Database\Eloquent\Builder实例,因此您可以在事件存储表中执行任何查询。

get()

从默认事件存储表获取所有事件。返回一个集合。

get($event_name)

从事件存储表获取特定类型的所有事件。自动确定要搜索的表。返回一个集合。

stream($stream_name)

设置专用表并返回Illuminate\Database\Eloquent\Builder实例,因此您可以在事件存储表中执行任何查询。

异常处理

默认情况下,EventStore在add()方法调用期间抑制发生的任何异常。您可以通过更改config/eventstore.php中的throw_exceptions设置来禁用此功能。

'throw_exceptions' => true,

测试

使用以下命令运行测试

vendor/bin/phpunit