maslauskas / event-store
基于MySQL的Laravel简单事件存储
Requires (Dev)
- orchestra/testbench: ~3.5
This package is auto-updated.
Last update: 2024-09-13 18:33:29 UTC
README
使用MySQL实现的Laravel简单事件存储实现包。
安装
要开始使用此包,请使用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_created
、email_sent
、order_shipped
等。$payload
:要记录的值的数组。例如,对于user_created
事件,您可以传递创建用户时使用的属性数组。$target_id
:(可选)数据库中目标模型的ID。例如,对于email_sent
事件,您可以传递user_id
作为$target_id
。这有助于在将来您希望获取与特定用户相关的所有事件时。$before
:(可选)已更改的值的数组。例如,对于user_updated
事件,您可能传递$user->toArray()
以记录更改的属性及其值。 注意:add()
方法自动过滤出仅存在于$payload
参数中的键,以避免不必要的开销。
有时,某些事件的发生频率比其他事件高得多,例如user_created
和user_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