PHP实现基于状态的责任链审批模式详解


Posted in PHP onMay 31, 2019

本文实例讲述了PHP实现基于状态的责任链审批模式。分享给大家供大家参考,具体如下:

我们开发网站,除了前后,还有后台,除了内容管理,很多时候要涉及到『审批』。

比如:商务部要做个专题推广活动,活动中需要调用一些商品做优惠。

1、商务部编辑先写文案
2、商务部领导审批文案内容
3、商品部领导需要审批商品的价格和库存(万一没货呢)
4、后面可能还有好多领导要审批(带扩展)

今天我们要引入的模式是『责任链模式』

在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来,形成一条链条。请求在这个链条上传递,知道链条上的某一个对象决定处理次请求。发出这个请求的客户端并不知道链条上哪一个对象最终处理这个请求。

为了演示方便,我们做价格设定。

1、假定层级关系是:商品部领导>商务部领导>编辑
2、假设只能一级级审批(也就是不能跳级,仅为了演示方便)
3、这里审批暂时不能回退

PHP实现基于状态的责任链审批模式详解

(上图:演示界面show.php)

show.php:

<?php
  require('subject.php');
  if ($_GET){
    if (isset($_GET['createSubject'])){ //点击创建文案后执行
      $subject = new subject();
      $subject->content = '文案的内容';
      $subject->save();
    }
  }
?>
<html>
  <head>
    <title>责任链-审批</title>
    <style>
      *{marign:0;padding:0}
      .container{width:100%;margin: 0 auto;text-align: center}
    </style>
  </head>
  <body>
    <div class="container">
      <div><h2>流程演示界面</h2></div>
      <form method="get" action="show.php">
        <div class="row">
          <textarea name="" id="" cols="30" rows="10"></textarea>
          <div>
            <button name="createSubject">编辑创建文案</button>
          </div>
        </div>
        <div class="row">
          <hr>
          <button name="step">领导审批</button>
        </div>
      </form>
    </div>
  </body>
</html>

编辑点击『创建文案』提交内容,然后把文案写到到本地json文件(保存)。文案的主题是subject.php:

<?php
class subject
{
  public $content = ''; //文案内容
  public $state = 0; //初试状态
  /**
   * 保存内容(编辑保存)
   */
  public function save(){
    //我们这里保存到本地文件
    file_put_contents(__DIR__.'/subject.json',json_encode($this));
    echo '文案已经创建成功';
  }
}

这个时候文案已经创建好了,需要进入审批

抽象类(领导)manager.php :

<?php
abstract class manager
{
  public $subject; //加载专题内容
  public $mystate=0; //当前状态,这个很重要
  public $leader=false; //重要,设置自己的领导是谁
  public $myname = ''; //当前审批者的名字
  /**
   * 设置领导是谁
   * @param $leader
   */
  public function setLeader($leader)
  {
    $this->leader = $leader; //形成责任链的关键
  }
  public function __construct()
  {
    $str = file_get_contents(__DIR__.'/subject.json');
    $this->subject = json_decode($str);
  }
  public function step($msg)
  {
    //很重要,代表审批
    //只有当subject的state和自己的mystate相等是才会处理
    if ($this->subject->state == $this->mystate){ //代表当前是自己要处理的
      //在这执行审批通过的 具体
      echo $msg . '审批制是:'.$this->myname;
      //判断自己的是否有领导,如果有把控制权交给领导
      if ($this->leader){
        $this->subject->state = $this->leader->mystate; //交控制权
        file_put_contents(__DIR__.'/subject.json',json_encode($this->subject)); //保存状态
      }else{
        echo '审批已经结束';
      }
    }else{
      if ($this->leader){ //leader就是维护整个类的 链
        //让自己的领导去审批
        $this->leader->step($msg);
      }
    }
  }
}

商务部领导,商品部领导,大boss都要继承这个抽象类。

BusinessLeader.php

<?php
class BusinessLeader extends manager
{
  public $myname = '商务部领导';
  public $mystate = 0;
}

ProductLeader.php:

<?php
class ProductLeader extends manager
{
  public $myname = '商品部领导';
  public $mystate = 1;
}

LastLeader.php

<?php
class LastLeader extends manager
{
  public $myname = '终极领导';
  public $mystate = 2;
}

在编辑提交文案之后,会进入『领导审批』阶段:

if (isset($_GET['step'])){ //进入领导审批阶段了
  //这里面最关键是
   //1.确定第一个领导是谁
   //2. 要维护各个领导直接的关系,
   require ('manager.php');
   require ('BusinessLeader.php');
   require ('ProductLeader.php');
   require ('LastLeader.php');
   $businessLeader = new BusinessLeader();
   $productLeader = new ProductLeader();
   $lastLeader = new LastLeader();
   //下面还是维护关系
   $businessLeader->setLeader($productLeader);
   $productLeader->setLeader($lastLeader);
   $businessLeader->step('审批通过');
}

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
用PHP创建PDF中文文档
Oct 09 PHP
WINXP下apache+php4+mysql
Nov 25 PHP
PHP 操作文件的一些FAQ总结
Feb 12 PHP
PHP5中新增stdClass 内部保留类
Jun 13 PHP
php编写的简单页面跳转功能实现代码
Nov 27 PHP
PH P5.2至5.5、5.6的新增功能详解
Jul 14 PHP
PIGCMS 如何关闭聊天机器人
Feb 12 PHP
thinkphp多表查询两表有重复相同字段的完美解决方法
Sep 22 PHP
ThinkPHP 3.2.2实现事务操作的方法
May 05 PHP
PHP对称加密算法(DES/AES)类的实现代码
Nov 14 PHP
laravel请求参数校验方法
Oct 10 PHP
Laravel 实现在Blade模版中使用全局变量代替路径的例子
Oct 22 PHP
Laravel框架实现调用百度翻译API功能示例
May 30 #PHP
Laravel框架学习笔记之批量更新数据功能
May 30 #PHP
PHP实现的微信公众号扫码模拟登录功能示例
May 30 #PHP
PHP使用PDO创建MySQL数据库、表及插入多条数据操作示例
May 30 #PHP
TP5(thinkPHP5框架)基于bootstrap实现的单图上传插件用法示例
May 29 #PHP
TP5(thinkPHP框架)实现后台清除缓存功能示例
May 29 #PHP
PHP微信网页授权的配置文件操作分析
May 29 #PHP
You might like
PHP Smarty生成EXCEL文档的代码
2008/08/23 PHP
对PHP新手的一些建议(PHP学习经验总结)
2014/08/20 PHP
smarty自定义函数htmlcheckboxes用法实例
2015/01/22 PHP
php上传图片生成缩略图(GD库)
2016/01/06 PHP
PHP使用栈解决约瑟夫环问题算法示例
2017/08/27 PHP
PHP+百度AI OCR文字识别实现了图片的文字识别功能
2019/05/08 PHP
JavaScript 对象模型 执行模型
2009/12/06 Javascript
IE6已终止操作问题的2种情况及解决
2014/04/23 Javascript
jQuery创建DOM元素实例解析
2015/01/19 Javascript
JavaScript中的函数嵌套使用
2015/06/04 Javascript
js删除Array数组中指定元素的两种方法
2016/08/03 Javascript
微信小程序 在Chrome浏览器上运行以及WebStorm的使用
2016/09/27 Javascript
Bootstrap CSS组件之大屏幕展播
2016/12/17 Javascript
Vue.2.0.5过渡效果使用技巧
2017/03/16 Javascript
d3.js入门教程之数据绑定详解
2017/04/28 Javascript
Vue2.0 从零开始_环境搭建操作步骤
2017/06/14 Javascript
vue中使用ueditor富文本编辑器
2018/02/08 Javascript
浅谈用Webpack路径压缩图片上传尺寸获取的问题
2018/02/22 Javascript
vue-cli 使用vue-bus来全局控制的实例讲解
2018/09/15 Javascript
elementui之el-tebs浏览器卡死的问题和使用报错未注册问题
2019/07/06 Javascript
vue实现一个6个输入框的验证码输入组件功能的实例代码
2020/06/29 Javascript
给Python初学者的一些编程技巧
2015/04/03 Python
浅谈MySQL中的触发器
2015/05/05 Python
一张图带我们入门Python基础教程
2017/02/05 Python
python使用正则表达式替换匹配成功的组
2017/11/17 Python
浅谈pandas中Dataframe的查询方法([], loc, iloc, at, iat, ix)
2018/04/10 Python
Python绘制正余弦函数图像的方法
2018/08/28 Python
pytorch构建多模型实例
2020/01/15 Python
canvas实现手机的手势解锁的步骤详细
2020/03/16 HTML / CSS
Solid & Striped官网:美国泳装品牌
2019/06/19 全球购物
迪拜领先运动补剂零售品牌中文站:Sporter商城
2019/08/20 全球购物
Woods官网:加拿大最古老、最受尊敬的户外品牌之一
2020/09/12 全球购物
What's the difference between an interface and abstract class? (接口与抽象类有什么区别)
2012/10/29 面试题
幼儿园三八妇女节活动方案
2014/03/11 职场文书
小学关爱留守儿童活动方案
2014/08/25 职场文书
湖南省召开党的群众路线教育实践活动总结大会报告
2014/10/21 职场文书