bjuppa/eloquent-state-machine

Laravel Eloquent 模型的有限状态机

v0.1.0 2023-08-31 06:33 UTC

This package is auto-updated.

Last update: 2024-08-30 01:17:50 UTC


README

此包允许您将 Laravel Eloquent 模型及其关系视为 扩展状态分层状态机 中的状态。

将此包与其他大多数状态机实现区分开来的哲学是,行为在代表 状态事件 的类中 在代码 中声明,而 模型 本身决定了当前状态。没有对状态机 的整体配置。当前状态处理传入的事件并将模型 转换 到另一个状态。

  • 每个状态和事件都由一个 PHP 类表示,该类扩展了一个相关的基类。
  • 状态声明它所属的 超状态复合)。
  • 事件被派发到模型的当前状态。
  • 事件处理在数据库事务中进行,并使用悲观行锁。
  • 当前状态评估传入的事件(守卫),并可能启动到另一个(命名)状态的 转换
  • 当前状态未明确处理的事件将向上冒泡状态分支。
  • 状态有 进入退出 动作,事件有在转换期间操作模型的 动作
  • 副作用可以延迟到转换完成后进行处理。
  • 转换期间的任何异常都会抛出异常,触发事务回滚。

项目状态

我,Björn Nilsved,于2020年创建了此包,用于一个自2021年以来一直处于生产状态的应用程序。状态机功能的发展过程相当是探索性的,并且专注于该特定应用程序的需求。由于状态机 API、基类等变化很大,我在应用程序本身中编写了特定的测试,并且在结构稳定之前推迟编写包的通用测试。当然,一旦 API 稳定并且应用程序部署,我就从未着手编写那些测试或按计划编写包的文档...

对我来说,这种情况很好,我对应用程序的测试套件有信心。如果其他人对此包感兴趣,我愿意付出努力来为稳定版 1.0 的发布设置适当的测试和文档。如果您希望看到这种情况发生,请 联系我

需求

行级锁定仅在 MySQL / MariaDB 和 PostgreSQL 中受支持。

安装

您可以通过 composer 安装此包

composer require bjuppa/eloquent-state-machine

用法

首先为您的状态机绘制一个 状态图,没有它,您可能会错过某些状态、转换、事件或动作。

与图中特定状态相关的一切 都直接编码到该状态的 PHP 类的独立方法中。

安全

如果您发现任何与安全相关的问题,请通过电子邮件 nilsved@gmail.com 而不是使用问题跟踪器。

鸣谢

许可协议

MIT 许可协议(MIT)。请参阅 许可文件 以获取更多信息。