如何灵活配置多版本业务流程?
说明#
我先举个例子:我从家起床到学校去上课,这期间我需要做这些事情:洗漱
、吃饭
、收拾书包
、交通
。这些事情可以做很多种排序,简单举两个:
如果我是一个做事很讲规矩的人,那么,我每天都会按照顺序1
来做。
可是巧了,我是一个很随性的人,我偏要一三五按照顺序2
做,二四六按照顺序3
做,周日啥都不不做(躺一天)。
问题#
对应到业务代码中,我们怎么去灵活的定义多个版本的业务流程呢?
砖头#
我先抛个砖,希望大佬能有更好的实现方式。
首先,在 controller
中,定义出洗漱
、吃饭
、收拾书包
、交通
等方法。
class Controller
{
public function wash(){
// 假装有业务代码
}
public function eat(){}
public function packUp(){}
public function traffic(String $kind){}
}
然后再定义一个流程变量,将顺序1
放入其中:
class Controller
{
public $assembly_line_one = [
[
'info' => '洗漱',
'func' => 'wash',
'params' => [],
],
[
'info' => '吃饭',
'func' => 'eat',
'params' => [],
],
[
'info' => '收拾书包',
'func' => 'packUp',
'params' => [],
],
[
'info' => '交通',
'func' => 'traffic',
'params' => ['公交'],
],
];
public function wash(){
// 假装有业务代码
}
public function eat(){}
public function packUp(){}
public function traffic(String $kind){}
}
此时,我是一个老实人,只会按照这一个流程执行:
class Controller
{
...
public function run()
{
// 按照 $assembly_line_one 定义的流程顺序执行
foreach ($this->assembly_line_one as $step) {
$this->{$step['func']}(...$step['params']);
}
}
}
那如果我是一个精分呢?就可以再多定义几个 $assembly_line_two
、$assembly_line_three
等等。
class Controller
{
...
public function run()
{
$today_assembly_line = [];
if($today->isMonday()){
// 周一的顺序
$today_assembly_line = $this->assembly_line_one;
}
if($today->isTuesday()){
// 周二的顺序
$today_assembly_line = $this->assembly_line_two;
}
foreach ($today_assembly_line as $step) {
$this->{$step['func']}(...$step['params']);
}
}
}
以上的方式还可以进行下修改升级,将 func
的值设置为类似 SomeClass@func
的形式,这样就可以指定其他类中的方法去执行(当然 foreach
中的代码也需要同步修改做支持)。
最后#
以上仅是自己抖了个小机灵,有错误的地方还望指正。更希望各路大佬提供些更好的思路和现成的实现,我也学习一下。
推荐文章: