2018-03-22 14:41:51
              
 
            | 李艳玲 
 | 
 数据表
workflow table 工作流  
workflow_node 工作流节点  
workflow_node_action 工作流节点动作表  workflow_node_action.cfg结构如下: { 
// action的多个结果分别会跳到哪个节点 
results: { 
success: { 
node_id: 
111,
                } 
pending: { 
node_id: 
222,
                } 
failed: { 
node_id: 
444,
                }
            }
            /
/ 强耦合的工作流系统,需要配置多个应用/module有关的东西 
modules: { 
main: { 
// 要执行这个actin要进入的url 
action_urls: [ 
"user/edit", 
"user/edit-post",
                    ], 
// action的结果,这里的results只需要配置与
module有关的东西,如
url 
results: { 
success: { 
next_url: 
"abc/def", 
next_url_method: 
"redirect" } 
pending: {} 
failed: {}
                    }
                }, 
other_modules: {}
            }
        }调用示例:Class OrderController(){
    function selectWorker(){ 
return view(
'selectWorker');
    }
    function selectWorkerPost(){ 
// 控制器层的验证规则 
// 调用服务层 OrderService
::selectWorkder(
$orderId, 
$workerId); 
// 返回数据结果,可根据Workflow的处理结果和配置,自动跳转,如: 
return OrderService
::getWorkflow()
->processResult();
    }
}
Class OrderService{
    function selectWorkder(
$orderId, 
$workerId){ 
$order 
= 
Order
::find(
$orderId); 
$wf 
= 
self
::getWorkFlow(); 
// 工作流检查节点能否执行该动作 
$wf
->check(
$order
->status, 
'selectWorkder'); 
// 其它页面规则的验证 
// 处理数据 
$result 
= 
'success'; 
// 记录工作流的动作,方便控制器调整数据和配置进行下一步处理,并返回业务对象下一个状态 
$nextStatus 
= 
$wf
->procces(
$orderOldStatus, 
'selectWorkder', 
$result); 
// 保存数据和最新的状态 
// 后续处理 Event::on('after-select-worker'); 
//  组装并返回数据 }
}结论
工作流引擎只适用在流程可能会变化的业务中。  否则简单的系统,直接在controller中配置URL,在业务层中直接写状态转换,这样可能更灵活简洁。 如果流程再要灵活点,例如,用户是男的或女的走的流程不一样,你就需要在cfg里面做详尽的配置。 
应用  | 
 
李艳玲 最后编辑, 2018-03-23 08:24:06  
 
 
