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

 更新时间:2019年05月31日 11:01:14   作者:学习笔记666  
这篇文章主要介绍了PHP实现基于状态的责任链审批模式,结合实例形式详细分析了责任链审批模式的原理及相关php实现流程,需要的朋友可以参考下

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

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

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

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

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

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

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

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

(上图:演示界面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数组(Array)操作技巧大全》、《PHP基本语法入门教程》、《PHP运算与运算符用法总结》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总

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

相关文章

  • 正确的PHP匹配UTF-8中文的正则表达式

    正确的PHP匹配UTF-8中文的正则表达式

    这篇文章主要介绍了正确的PHP匹配UTF-8中文的正则表达式,本文对比给出了两个不同的正则表达式,需要的朋友可以参考下
    2015-05-05
  • Yii框架中memcache用法实例

    Yii框架中memcache用法实例

    这篇文章主要介绍了Yii框架中memcache用法,以实例形式分析了在Yii框架中加入memcache的具体操作方法,是非常实用的技巧,需要的朋友可以参考下
    2014-12-12
  • YII框架实现自定义第三方扩展操作示例

    YII框架实现自定义第三方扩展操作示例

    这篇文章主要介绍了YII框架实现自定义第三方扩展操作,结合实例形式分析了Yii框架自定义第三方扩展操作的步骤与相关实现技巧,需要的朋友可以参考下
    2019-04-04
  • Codeigniter通过SimpleXML将xml转换成对象的方法

    Codeigniter通过SimpleXML将xml转换成对象的方法

    这篇文章主要介绍了Codeigniter通过SimpleXML将xml转换成对象的方法,涉及Codeigniter操作XML文件的技巧,非常具有实用价值,需要的朋友可以参考下
    2015-03-03
  • php session_decode函数用法讲解

    php session_decode函数用法讲解

    在本篇文章里小编给大家整理了关于php session_decode函数怎么用的相关知识点以及实例内容,需要的朋友们学习下。
    2019-05-05
  • ThinkPHP实现ajax仿官网搜索功能实例

    ThinkPHP实现ajax仿官网搜索功能实例

    这篇文章主要介绍了ThinkPHP实现ajax仿官网搜索功能的方法,实例演示了后台查询功能与前台Ajax提交搜索数据的方法,是非常实用的技巧,需要的朋友可以参考下
    2014-12-12
  • 2014年最新推荐的10款 PHP 开发框架

    2014年最新推荐的10款 PHP 开发框架

    在这篇文章我们会介绍 10 款最好的 PHP 框架,这些框架都是最新评定的,可以大大的简化你的开发任务。这些 PHP 框架可以帮助开发者快速设计和开发各种跨浏览器的动态网站和 web 应用,最后,希望你能在这些列表中找到你想要的 PHP 框架!
    2014-08-08
  • PHP实现图片旋转效果实例代码

    PHP实现图片旋转效果实例代码

    这篇文章主要介绍了PHP实现图片旋转效果实例代码,本文给出代码示例,代码中包含一些说明注释,需要的朋友可以参考下
    2014-10-10
  • 浅析PHP中的闭包和匿名函数

    浅析PHP中的闭包和匿名函数

    PHP闭包和匿名函数使用的句法与普通函数相同,但闭包和匿名函数其实是伪装成函数的对象(Closure类的实例) 。下面给大家介绍PHP中的闭包和匿名函数知识,需要的朋友参考下吧
    2017-12-12
  • php面向对象的用户登录身份验证

    php面向对象的用户登录身份验证

    这篇文章主要为大家详细介绍了php面向对象的用户登录身份验证,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06

最新评论