vespolina / action
Vespolina动作库,用于处理通知等活动
dev-master
2013-09-30 17:41 UTC
Requires
- php: >=5.3.0
Requires (Dev)
This package is auto-updated.
Last update: 2024-09-18 21:00:29 UTC
README
介绍
该库管理动作的生命周期。动作是在特定时间执行的操作。这可能是直接执行或计划在未来执行。动作跟踪执行结果并将执行状态保存到持久层。你希望在动作中包含的典型事物包括通知、向客户发送邮件、执行Web服务调用等。动作通常由主题上的系统事件引发(例如,销售订单引发“已确认”事件)。
与传统事件处理相比,动作的另一个特点是动作可以被重新处理和重新调度(例如,在一周后执行)。当订单履行后,可以调度动作在客户支付订单一周后向客户发送欢迎礼包。
此外,动作可以完全记录,包括它们运行的上下文,以供审计目的。
例如,当在欧洲执行公司ID检查时,根据法律规定,需要存储Web服务调用的结果。
动作管理器可以检索特定主题(例如订单)的动作执行记录,并允许重新处理动作。如果客户没有收到订单确认邮件,可以再次触发与确认相关的动作。
示例
内存动作管理器
$dispatcher = new EventDispatcher(); $actionManager = new ActionManager(new ActionDefinitionMemoryGateway(), $dispatcher); //Register two action definitions $actionDefinition1 = new ActionDefinition('cleanTheCar', 'car'); $actionDefinition2 = new ActionDefinition('fuelTheCar', 'car'); $actionManager->addActionDefinition($actionDefinition1); $actionManager->addActionDefinition($actionDefinition2); //Create two action event listeners public class CleanTheCar { function onExecute(ActionEvent $event) { //Clean the car $event->getAction()->setState(Action::STATE_COMPLETED); } } public class FuelTheCar { function onExecute(ActionEvent $event) { //Check for gasoline for subject $action->getSubject(); if ($gasolineAvailable) { //Fuel the car $event->getAction()->setState(Action::STATE_COMPLETED); } else { $event->getAction()->setState(Action::STATE_FAILED); } } } //Register the events to the dispatcher $dispatcher->addListener('v.action.cleanTheCar.execute', array(new CleanTheCar(), 'onExecute')); $dispatcher->addListener('v.action.fuelTheCar.execute', array(new FuelTheCar(), 'onExecute')); //Launch an action $actionManager->launchAction('cleanTheCar', new Porsche(911));
处理结果
- 创建一个动作实例以跟踪处理
- 在我们的简单示例中,动作可以直接执行
- 处理结果持久化到持久网关(在本例中为内存,但通常为数据库)
- 假设由于找不到汽油而无法加油。动作肯定会失败。通常有人会收到通知,动作会在稍后再次执行。
我们可以检测失败的动作并重新处理它们(如果动作定义允许)
$failedActions = $actionManager->findActionsByState(Actions::FAILED, $myCar); foreach ($failedActions as $action) { $actionManager->execute($action); }
动作管理器记录重新处理尝试的新尝试。
动作定义
动作定义包含以下信息
- name:动作定义的名称,应该是唯一的
- topic:您可以可选地定义动作的主题。例如,“订单”、“客户”
- 事件名称:当动作要执行时分发的事件的名称
- handler class:处理动作整体行为和生命周期的类的名称
- scheduling type:动作应直接执行还是计划在未来执行?
- parameters:一个参数数组,这些参数注入到在处理期间需要的新创建的动作中。例如,如果动作是邮件通知,模板名称可以是参数
isReprocessingAllowed:我们是否允许以任何方式重新处理动作?
网关支持
- 目前我们支持以下动作网关
- 内存网关
Doctrine MongoDB网关
- 待办事项
- 使用事件分发器分发动作生命周期事件