winzou / state-machine
一个非常轻量且强大的PHP状态机
0.4.4
2024-01-29 09:14 UTC
Requires
- php: ^7.4|^8.0|^8.1
- symfony/event-dispatcher: ^4.4|^5.4|^6.0|^7.0
- symfony/expression-language: ^4.4|^5.4|^6.0|^7.0
- symfony/property-access: ^4.4|^5.4|^6.0|^7.0
Requires (Dev)
- phpspec/phpspec: ^5.0|^6.0|^7.1
- twig/twig: ^2.10|^3.0
Suggests
- twig/twig: Access the state machine in your twig templates (^2.10|^3.0)
README
定义你的状态,定义你的转换和回调:我们来做其余的事情。硬编码状态的年代已经过去了!
安装(通过composer)
{ "require": { "winzou/state-machine": "~0.1" } }
使用方法
配置状态机图
为了使用状态机,你首先需要定义一个图。图是对状态、转换以及可选的回调的定义;所有这些都附加到你的领域对象上。可以给同一个对象附加多个图。
让我们为我们的 DomainObject
对象定义一个名为 myGraphA 的图
$config = array( 'graph' => 'myGraphA', // Name of the current graph - there can be many of them attached to the same object 'property_path' => 'stateA', // Property path of the object actually holding the state 'states' => array( 'checkout', 'pending', 'confirmed', 'cancelled' ), 'transitions' => array( 'create' => array( 'from' => array('checkout'), 'to' => 'pending' ), 'confirm' => array( 'from' => array('checkout', 'pending'), 'to' => 'confirmed' ), 'cancel' => array( 'from' => array('confirmed'), 'to' => 'cancelled' ) ), 'callbacks' => array( 'guard' => array( 'guard-cancel' => array( 'to' => array('cancelled'), // Will be called only for transitions going to this state 'do' => function() { var_dump('guarding to cancelled state'); return false; } ) ), 'before' => array( 'from-checkout' => array( 'from' => array('checkout'), // Will be called only for transitions coming from this state 'do' => function() { var_dump('from checkout transition'); } ) ), 'after' => array( 'on-confirm' => array( 'on' => array('confirm'), // Will be called only on this transition 'do' => function() { var_dump('on confirm transition'); } ), 'to-cancelled' => array( 'to' => array('cancelled'), // Will be called only for transitions going to this state 'do' => function() { var_dump('to cancel transition'); } ), 'cancel-date' => array( 'to' => array('cancelled'), 'do' => array('object', 'setCancelled'), ), ) ) );
因此,在上面的示例中,该图有6个可能的状态,这些状态可以通过对对象应用一些转换来实现。例如,当你创建一个新的 DomainObject
时,你会对该对象应用 'create' 转换,然后它的状态将变为 pending。
使用状态机
定义
状态机是实际操作你的对象的那个对象。通过使用状态机,你可以测试是否可以应用转换,实际应用转换,检索当前状态等。 一个状态机针对一对对象 + 图。 这意味着,如果你想操作另一个对象,或者同一个对象使用另一个图,你需要另一个状态机。
工厂帮助你获取这些对象 + 图的状态机。你给它一个对象和一个图名,它会返回这对的状态机。如果你想将这个工厂作为服务在你的Symfony2应用程序中使用,请参阅相应的StateMachineBundle。
使用方法
请参考 examples
文件夹中的几个示例。
回调
回调用于保护转换或在应用转换前后执行一些代码。
保护回调必须返回一个 bool
。如果一个保护返回 false
,则不能执行转换。
致谢
这个库受到了https://github.com/yohang/Finite的极大启发,但它采取了另一个方向。