使用状态机定义评论的工作流-Symfony5全面开发

您需要登录后才可观看此视频

为了更好的为您提供服务,请您登录后再查看本课程。

立即登录

目前我们在详情页提交的评论,提交之后评论会直接在评论列表中进行显示。我们需要为评论添加审核功能。新添加的评论只有审核通过之后才会在评论列表进行显示。而审核不通过的评论,我们可以编辑评论的内容再次进行审核,直到审核通过。

评论的审核流程我们可以定义为一个状态机。回到项目,首先我们来修改Comment类,在Comment类中我们需要添加一个属性来保存当前评论对象的状态。打开控制台,输入symfony console make:entity,类名我们输入Comment,属性名称我们叫做status,类型这里选择string类型,长度255,在数据库中可以为空吗?这里选择yes。回车要退出命令行。

我们查看一下命令行的更改,在Comment类中添加了$status属性,状态机同时只能保存一个状态,这里使用string类型没有问题,我们修改对应的get方法和set方法,在setStatus()方法中我们添加第二个参数$context。

#src/Entity/Comment.php

class Comment
{
    // ...

    /**
    * @ORM\Column(type="string", length=255, nullable=true)
    */
    private $status;

    public function getStatus(): ?string
    {
        return $this->status;
    }

    public function setStatus(?string $status, $context = []): self
    {
        $this->status = $status;

        return $this;
    }
    // ...
}

我们还需要创建migration文件,打开控制台,复制命令行,粘贴。执行数据库的更改,粘贴输入yes。现在数据库comment表中就添加了status列,现在我们就可以定义评论的工作流了。

打开workflow.yaml配置文件,在workflows配置下,我们定义新的工作流名称叫做comment_check。我们复制之前定义好的工作流,然后进行修改,粘贴,类型这里我们选择状态机status_machine。这里需要调整一下对齐,属性仍然是status,当前状态机所对应的类是Comment类,我们定一些状态。

首先是新的评论,然后是检查状态checking。如果审核不通过的话,我们需要编辑,然后是拒绝状态rejected,然后是approved。初始化的状态是new状态,我们定一些状态的转换。首先是start_checkfrom: newto: checking。然后是审核未通过check_rejectedfrom: checkingto: rejected。然后是re_edit重新编辑,from:rejectedto: edit。然后是重新审核re_check,这里from: editto: checking。最后是审核通过check_approvedfrom: checkingto: approved

#config/packages/workflow.yaml

framework:
    workflows:
        comment_check:
            type: 'state_machine'
            audit_trail:
                enabled: true
            marking_store:
                type: 'method'
                property: 'status'
            supports:
                - App\Entity\Comment
            initial_marking: new
            places:
                - new
                - checking
                - edit
                - rejected
                - approved
            transitions:
                start_check:
                    from: new
                    to: checking
                check_rejected:
                    from: checking
                    to: rejected
                re_edit:
                    from: rejected
                    to: edit
                re_check:
                    from: edit
                    to: checking
                check_approved:
                    from: checking
                    to: approved

这样我们就定义好了评论的工作流,我们打开控制台生成一下评论工作流的图表,我们使用symfony console workflow:dump comment_check,我们使用dot库,图片的类型这里输入SVG,输出文件的名称,我们叫做comment_check.svg

php bin/console workflow:dump comment_check | dot -Tsvg -o comment_check.svg

回车,我们查看项目根目录,在根目录下就生成了SVG文件。查看一下图片,新提交的评论初始化为new状态。当点击开始检查之后,转换为checking状态,如果检查失败的话,我们需要重新编辑,重新编辑成功之后开始检查,如果检查成功的话,状态会修改approved。这就是我们期望的状态机的流程。

我们打开vendor目录查看一下工作流的源码。在symfony目录下,我们打开workflow目录。在workflow根目录下有个Workflow.php文件,我们打开这个文件,Workflow类就是我们工作流的服务类。然后对应的还有个StateMachine类,这个类就是状态机的类,我们查看一下状态机类的源码。状态机类它继承于Workflow类,在类中只对构造方法有个修改,在构造方法中唯一的不同就是状态机同时只能保存一个状态,其他的方法和工作流是一样的。

这里我们就不再详细的介绍了,如果有兴趣的话,我们可以查看Symfony官方提供的一个案例,案例的代码在github上进行了开源,我们已经定义了文章操作的工作流。

当有新的文章发表时,对应角色的用户对文章进行审核。我们可以在新的文章创建时,可以向对应的角色用户发送邮件,通知他们来完成相应的工作。在下节课,我们先来安装邮件组件,使用邮件组件来发送邮件。

课程讨论

当前内容评论功能已关闭。