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 相关文章推荐
火车头discuz6.1 完美采集的php接口文件
Sep 13 PHP
php面向对象全攻略 (十四) php5接口技术
Sep 30 PHP
第四章 php数学运算
Dec 30 PHP
Yii2 rbac权限控制操作步骤实例教程
Apr 29 PHP
thinkPHP5.0框架简单配置作用域的方法
Mar 17 PHP
PHP设计模式之工厂模式实例总结
Sep 01 PHP
php实现的AES加密类定义与用法示例
Jan 29 PHP
PHP实现获取url地址中顶级域名的方法示例
Jun 05 PHP
PHP中常用的三种设计模式详解【单例模式、工厂模式、观察者模式】
Jun 14 PHP
php弹出提示框的是实例写法
Sep 26 PHP
php实现映射操作实例详解
Oct 02 PHP
PHP pthreads v3下worker和pool的使用方法示例
Feb 21 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 增加了对 .ZIP 文件的读取功能
2006/10/09 PHP
ThinkPHP控制器里javascript代码不能执行的解决方法
2014/11/22 PHP
laravel容器延迟加载以及auth扩展详解
2015/03/02 PHP
php实现二进制和文本相互转换的方法
2015/04/18 PHP
php实现短信发送代码
2015/07/05 PHP
详解cookie验证的php应用的一种SSO解决办法
2017/10/20 PHP
php实现生成带二维码图片并强制下载功能
2018/02/24 PHP
Javascript创建Silverlight Plugin以及自定义nonSilverlight和lowSilverlight样式
2010/06/28 Javascript
text-align:justify实现文本两端对齐 兼容IE
2015/08/19 Javascript
JS操作XML实例总结(加载与解析XML文件、字符串)
2015/12/08 Javascript
asp.net+jquery.form实现图片异步上传的方法(附jquery.form.js下载)
2016/05/05 Javascript
angular.js 路由及页面传参示例
2017/02/24 Javascript
微信小程序--onShareAppMessage分享参数用处(页面分享)
2017/04/18 Javascript
layui问题之模拟select点击事件的实例讲解
2018/08/15 Javascript
微信小程序实现顶部导航特效
2019/01/28 Javascript
JS判断两个数组或对象是否相同的方法示例
2019/02/28 Javascript
JS模拟浏览器实现全局搜索功能
2019/09/11 Javascript
vue使用axios实现excel文件下载的功能
2020/07/16 Javascript
[02:05]2014DOTA2西雅图国际邀请赛 BBC第二天小组赛总结
2014/07/11 DOTA
一篇不错的Python入门教程
2007/02/08 Python
Python中使用PIPE操作Linux管道
2015/02/04 Python
Python通过cv2读取多个USB摄像头
2019/08/28 Python
flask 框架操作MySQL数据库简单示例
2020/02/02 Python
基于PyTorch的permute和reshape/view的区别介绍
2020/06/18 Python
Python selenium环境搭建实现过程解析
2020/09/08 Python
浅析Python模块之间的相互引用问题
2021/02/26 Python
床上用品全球在线购物:BeddingInn
2016/12/18 全球购物
阿迪达斯法国官方网站:adidas法国
2018/03/20 全球购物
英国领先的隐形眼镜在线供应商:Lenstore.co.uk
2019/11/24 全球购物
Fnac西班牙官网:法国文化和电子产品零售商
2021/03/14 全球购物
物业保安主管岗位职责
2013/12/25 职场文书
晚会主持词开场白
2014/03/17 职场文书
班级标语大全
2014/06/21 职场文书
小学教师党员承诺书
2015/04/27 职场文书
工资证明格式模板
2015/06/12 职场文书
python计算列表元素与乘积详情
2022/08/05 Python