/** * Creates actions. * * @param string $comment Data * * @throws \InvalidArgumentException */ protected function buildActions($comment) { $pattern = '/@WF\\\\action (([^\\@]*) \\@ )?(([a-zA-Z\\/]*)\\:\\:)?([a-zA-Z]*) > (.*)/'; if (!preg_match_all($pattern, $comment, $tags, PREG_SET_ORDER)) { return; } $workflow = $this->factory->getWorkflow(); foreach ($tags as $tag) { $stateName = defined($tag[6]) ? constant($tag[6]) : $tag[6]; if (!($state = $workflow->getState($stateName))) { throw new \InvalidArgumentException('invalid state specified'); } $action = $this->factory->createAction($tag[5], $state); $action->setLabel($tag[2]); if ($tag[4]) { $this->configureAction($action, $tag[4]); } else { foreach ($workflow->getStates() as $state) { $state->addAction($action); } } } }
<?php require_once 'bootstrap.php'; use DevelArts\Workflow; $factory = new Workflow\WorkflowFactory(); // define states $factory->addStates([OrderStatusEnum::PLACED => 'Placed', OrderStatusEnum::PROCESSING => 'Processing', OrderStatusEnum::SENT => 'Sent', OrderStatusEnum::COMPLETED => 'Completed', OrderStatusEnum::CANCELED => 'Canceled']); $workflow = $factory->getWorkflow(); // create action "Process" $action = $factory->createAction('process', $workflow->getState(OrderStatusEnum::PROCESSING), new OrderProcessAction()); $action->setLabel('Process'); $action->addConstraint(new OrderProcessingConstraint()); // add process to states $workflow->getState(OrderStatusEnum::PLACED)->addAction($action); $workflow->getState(OrderStatusEnum::CANCELED)->addAction($action); // create action "Cancel" $action = $factory->createAction('cancel', $workflow->getState(OrderStatusEnum::CANCELED)); $action->addObserver(new OrderCancelReasonObserver()); $action->setLabel('Cancel'); // add cancel to states $workflow->getState(OrderStatusEnum::PLACED)->addAction($action); $workflow->getState(OrderStatusEnum::PROCESSING)->addAction($action); // create action "Send" $action = $factory->createAction('send', $workflow->getState(OrderStatusEnum::SENT)); $action->setLabel('Send'); // add send to states $workflow->getState(OrderStatusEnum::PROCESSING)->addAction($action); // create "Complete" action $action = $factory->createAction('complete', $workflow->getState(OrderStatusEnum::COMPLETED)); $action->setLabel('Complete'); // add complete to states