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 相关文章推荐
在IIS7.0下面配置PHP 5.3.2运行环境的方法
Apr 13 PHP
php后门URL的防范
Nov 12 PHP
php file_get_contents抓取Gzip网页乱码的三种解决方法
Nov 12 PHP
PHP修改session_id示例代码
Jan 08 PHP
10个实用的PHP正则表达式汇总
Oct 23 PHP
php计算到指定日期还有多少天的方法
Apr 14 PHP
PHP版本如何选择?应该使用哪个版本?
May 13 PHP
PHP实现简单爬虫的方法
Jul 29 PHP
两款万能的php分页类
Nov 12 PHP
PHP多维数组遍历方法(2种实现方法)
Dec 10 PHP
PHP中加速、缓存扩展的区别和作用详解(eAccelerator、memcached、xcache、APC )
Jul 09 PHP
PHP配置文件php.ini中打开错误报告的设置方法
Jan 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产生随机数的两种方法实例代码 输出随机IP
2011/04/08 PHP
从零开始学YII2框架(五)快速生成代码工具 Gii 的使用
2014/08/20 PHP
浅谈PHP的数据库接口和技术
2016/12/09 PHP
jquery 弹出登录窗口实现代码
2009/12/24 Javascript
关于javascript DOM事件模型的两件事
2010/07/22 Javascript
五个jQuery图片画廊插件 推荐
2011/05/12 Javascript
Flexigrid在IE下不显示数据的处理的解决方法
2013/10/24 Javascript
详解JavaScript中的every()方法
2015/06/08 Javascript
JavaScript数据类型判定的总结笔记
2015/07/31 Javascript
一起学写js Calender日历控件
2016/04/14 Javascript
AngularJS控制器之间的通信方式详解
2016/11/03 Javascript
BootStrap 下拉菜单点击之后不会出现下拉菜单(下拉菜单不弹出)的解决方案
2016/12/14 Javascript
详解javascript表单的Ajax提交插件的使用
2016/12/29 Javascript
js使用highlight.js高亮你的代码
2017/08/18 Javascript
详解Vue SPA项目优化小记
2018/07/03 Javascript
vue.js中toast用法及使用toast弹框的实例代码
2018/08/27 Javascript
利用jquery和BootStrap实现动态滚动条效果
2018/12/03 jQuery
一文看懂如何简单实现节流函数和防抖函数
2019/09/05 Javascript
vue-quill-editor插入图片路径太长问题解决方法
2021/01/08 Vue.js
python设置windows桌面壁纸的实现代码
2013/01/28 Python
python实现探测socket和web服务示例
2014/03/28 Python
Python操作CouchDB数据库简单示例
2015/03/10 Python
python基于socket实现网络广播的方法
2015/04/29 Python
pytorch 利用lstm做mnist手写数字识别分类的实例
2020/01/10 Python
Python3标准库之dbm UNIX键-值数据库问题
2020/03/24 Python
在服务器上安装python3.8.2环境的教程详解
2020/04/26 Python
斯凯奇美国官网:SKECHERS美国
2016/08/20 全球购物
英国羊皮鞋类领先品牌:Just Sheepskin
2019/12/12 全球购物
工商管理实习自我鉴定
2013/09/28 职场文书
校园网站的创业计划书范文
2013/12/30 职场文书
学校搬迁方案
2014/06/15 职场文书
民族学专业大学生职业规划范文:清晰未来的构想
2014/09/20 职场文书
小班教师个人总结
2015/02/05 职场文书
小学毕业感言200字
2015/07/30 职场文书
中秋晚会致辞
2015/07/31 职场文书
Go timer如何调度
2021/06/09 Golang