vespolina/action

Vespolina动作库,用于处理通知等活动

dev-master 2013-09-30 17:41 UTC

This package is auto-updated.

Last update: 2024-09-18 21:00:29 UTC


README

Build Status Total Downloads Latest Stable Version

介绍

该库管理动作的生命周期。动作是在特定时间执行的操作。这可能是直接执行或计划在未来执行。动作跟踪执行结果并将执行状态保存到持久层。你希望在动作中包含的典型事物包括通知、向客户发送邮件、执行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网关

  • 待办事项
  • 使用事件分发器分发动作生命周期事件