念念不忘,必有迴響

PHP 代码建模

推荐阅读文章 http://tigerb.cn/2019/10/11/oop/

其实很早之前就看到这篇文章,只是一直没有尝试过(实际工作中也没有发现身边的同行有使用这种概念的痕迹)。
第一次看到这个概念觉得好惊喜,打个比方,经常看一个方法有几千行的代码,突然发现一个可能可以让你从这样的情况解脱出来。。。
前不久照着作者的思路撸了一遍代码,于是有了以下目录(PS:发现拿来主义并不好用,比如作者贴的代码并不一定完全正确。。。。):

image

使用主要考虑点:

  • mysql:涉及到操作多表必定要依赖mysql的事务、多维度的情况下怎样更优雅的控制事务的提交跟回滚还是需要思考下。

部分代码

BehaviorOrderCreateInterface.php

<?php

namespace App\Services\Order;

interface BehaviorOrderCreateInterface
{
    public function do(RobotOrderCreate $robotOrderCreate);
}

RobotOrderCreate.php

<?php

namespace App\Services\Order;

use Illuminate\Support\Facades\DB;

class RobotOrderCreate
{
    private $infoUser = [];

    // 用于存储上下文的依赖
    public $context = [];

    public $rollback = 0;

    private $behaviorList = [];

    public function __construct()
    {

    }

    public function registerBehavior(\Closure ...$behavior)
    {
        $this->behaviorList = array_merge($this->behaviorList, $behavior);
        return $this;
    }

    public function create()
    {
        try {
            DB::beginTransaction();
            /** @var \Closure $behavior */
            foreach ($this->behaviorList as $behavior) {
                // todo 按实际情况
                if ($this->rollback) {
                    throw new \Exception("rollback 1");
                    break;
                }
                /** @var BehaviorOrderCreateInterface $interface */
                $interface = $behavior();
                $interface->do($this);
            }
            DB::commit();
        } catch (\Exception $exception) {
            DB::rollBack();
        }
    }
}

Order.php

<?php

namespace App\Services\Order;

class Order implements BehaviorOrderCreateInterface
{

    public function do(RobotOrderCreate $robotOrderCreate)
    {
        // TODO: Implement do() method.
        $do = __CLASS__ . '' . __FUNCTION__ . PHP_EOL;
        dump($do);
        // 往上下文依赖中写入 订单信息
        $robotOrderCreate->context = [
            'order_info' => $do
        ];

        return $do;
    }
}

-- END

写的不错,赞助一下主机费

扫一扫,用支付宝赞赏
扫一扫,用微信赞赏

暂无评论~~