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 相关文章推荐
攻克CakePHP系列三 表单数据增删改
Oct 22 PHP
linux命令之调试工具strace的深入分析
Jun 03 PHP
如何使用php判断所处服务器操作系统的类型
Jun 20 PHP
学习php分页代码实例
Oct 24 PHP
php Calender(日历)代码分享
Jan 03 PHP
PHP curl 获取响应的状态码的方法
Jan 13 PHP
php开启与关闭错误提示适用于没有修改php.ini的权限
Oct 16 PHP
php+xml实现在线英文词典之添加词条的方法
Jan 23 PHP
php session 写入数据库
Feb 13 PHP
php 判断IP为有效IP地址的方法
Jan 28 PHP
在PHP中输出JS语句以及乱码问题的解决方案
Feb 13 PHP
PHP抽象类与接口的区别实例详解
May 09 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作的文本留言本的例子(一)
2006/10/09 PHP
php创建多级目录代码
2008/06/05 PHP
PHP通过正则表达式下载图片到本地的实现代码
2011/09/19 PHP
php文件打包 下载之使用PHP自带的ZipArchive压缩文件并下载打包好的文件
2012/06/13 PHP
CI框架整合widget(页面格局)的方法
2016/05/17 PHP
JavaScript 序列化对象实现代码
2009/12/18 Javascript
js下关于onmouseout、事件冒泡的问题经验小结
2010/12/09 Javascript
js自动生成对象的属性示例代码
2013/10/28 Javascript
在JS中解析HTML字符串示例代码
2014/04/16 Javascript
如何根据百度地图计算出两地之间的驾驶距离(两种语言js和C#)
2015/10/29 Javascript
JavaScript基本语法学习教程
2016/01/14 Javascript
JavaScript:Date类型全面解析
2016/05/19 Javascript
bootstrap vue.js实现tab效果
2017/02/07 Javascript
jquery中关于bind()方法的使用技巧分享
2017/03/30 jQuery
JS实现评价的星星功能
2017/08/20 Javascript
JavaScript实现QQ列表展开收缩扩展功能
2017/10/30 Javascript
react-redux中connect的装饰器用法@connect详解
2018/01/13 Javascript
Python  连接字符串(join %)
2008/09/06 Python
使用Python绘制图表大全总结
2017/02/11 Python
微信跳一跳python代码实现
2018/01/05 Python
Python使用pylab库实现绘制直方图功能示例
2018/06/01 Python
详解pandas绘制矩阵散点图(scatter_matrix)的方法
2020/04/23 Python
解决python 在for循环并且pop数组的时候会跳过某些元素的问题
2020/12/11 Python
程序设计HTML5 Canvas API
2013/04/08 HTML / CSS
详解canvas绘图时遇到的跨域问题
2018/03/22 HTML / CSS
汉森冲浪板:Hansen Surfboards
2018/05/19 全球购物
部队万能检讨书
2014/02/20 职场文书
小学生评语大全
2014/04/18 职场文书
企业形象策划方案
2014/05/29 职场文书
财务管理专业毕业生求职信
2014/06/02 职场文书
中药学专业毕业生推荐信
2014/07/10 职场文书
旷课检讨书范文
2014/10/30 职场文书
2014年优秀班主任工作总结
2014/12/16 职场文书
财务工作个人总结
2015/02/27 职场文书
2015年银行个人工作总结
2015/05/14 职场文书
压缩Redis里的字符串大对象操作
2021/06/23 Redis