状态机和框架

时间:2015-08-15 14:26:34

标签: php symfony state-machine

我试图了解如何使用框架的各个部分。我正在开发一个自定义框架,即使用Symphony2的基本组件构建。

所以我们理解MVC有一个控制器来处理我们的路由方法。除此之外我们还有模型和模型。 repo(包含Symphony2类型实现)。

我感到困惑的是如何集成或实现状态机。我想知道哪个部分在哪里。

我想使用以下库,

https://github.com/yohang/Finite

现在我的当前状态保存在表列中。

那么我在哪里实现状态机接口,模型呢?初始化状态机,控制器在哪里?

2 个答案:

答案 0 :(得分:1)

就模型而言,您只需让模型对象实现StatefullInterface。例如,如果你使用的是Doctrine 2,那么你的模型对象只是一个普通的php对象。按照您的链接实现界面,您就完成了。

对于你的状态机,我会制作自定义状态机:

class MyStateMachine extends StateMachine
{
    public function __construct()
    {
        $this->addState(new State('s1', StateInterface::TYPE_INITIAL));
        $this->addState('s2');
        $this->addState('s3');
        $this->addState(new State('s4', StateInterface::TYPE_FINAL));

        $this->addTransition('t12', 's1', 's2');
        $this->addTransition('t23', 's2', 's3');
        $this->addTransition('t34', 's3', 's4');
        $this->addTransition('t42', 's4', 's2');

然后您可以在控制器中创建和初始化对象。作为替代方案,使用依赖注入并进行工厂服务。

我想你也可以直接在你的实体中嵌入状态机。可能不是一个好主意。

您链接的状态机似乎有点基本。每个对象只支持一个状态?我没有检查代码,但转换看起来也很原始。在投入太多时间之前,确保它满足您的需求。我总是只创建自定义机器。

答案 1 :(得分:1)

您可以使用状态机实现您的实体,这意味着状态机将放置在模型层中,应用程序的其余部分将与之交互 - 读取其状态并调用转换。

实体将提供API来调用转换,读取其状态并枚举可用的转换(如反射,但关于当前状态)。应用程序的其余部分可以询问实体的各个实例,接下来可以执行哪些操作并显示用户界面的相关部分。例如,它可以显示一个按钮,用于删除在当前状态下可用delete转换的实体。当单击删除按钮时,它将调用给定状态机上的删除转换。我发现这种方法非常普遍。

前段时间我创建了Smalldb框架来实现这样的状态机。它实现了Web应用程序的模型层,允许您为各个实体定义状态机并在PHP中实现它们的转换。它还会检查哪些用户可以调用哪些转换,并且几乎没有很好的功能,比如状态机可视化,使用Graphviz和REST API直接与JS的状态机交互(适用于SPA应用程序)。