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