container = $container; $this->producerService = $producerService; } public static function getSubscribedEvents() { return array( 'workflow.leave' => array('leave'), 'workflow.transition' => array('transition'), 'workflow.enter' => array('enter'), 'workflow.guard' => array('guard') ); } public function leave(Event $event) { foreach ($event->getTransition()->getFroms() as $place) { $actions = $this->getActions($event, 'leave', $place); foreach($actions as $k => $action) { $params = array('entity'=>$event->getSubject()); $this->completeAction($action, $params); } } } public function transition(Event $event) { $transitionName = $event->getTransition()->getName(); $actions = $this->getActions($event, 'transition', $transitionName); foreach($actions as $k => $action) { $params = array('entity'=>$event->getSubject()); $this->completeAction($action, $params); } } public function enter(Event $event) { foreach ($event->getTransition()->getTos() as $place) { $actions = $this->getActions($event, 'enter', $place); foreach($actions as $k => $action) { $params = array('entity'=>$event->getSubject()); $this->completeAction($action, $params); } } } public function guard(GuardEvent $event) { //$event->setBlocked(true); } /** * @param Event $event * @param string $eventName * @param string $eventReference * * @return array */ public function getActions($event, $eventName, $eventReference) { $logger = $this->container->get('logger'); $em = $this->container->get("doctrine.orm.entity_manager"); $object = $event->getSubject(); $objectClass = (string) get_class($object); $logger->info("EVENT {$eventName}:{$eventReference} => {$objectClass }_id_{$object->getId()}"); $criteria = array("workflowName" => $event->getWorkflowName(), "eventReference" => $eventReference ); $actions = $em->getRepository("WorkflowBundle:Action")->findBy($criteria); $new_actions = array(); foreach($actions as $action){ if(in_array($eventName, $action->getEvent()) AND is_a($object, $action->getObjectClass())){ $new_actions[] = $action; } } $actions = $new_actions; $logger->info("EVENT Found ". count($actions) . " actions to apply", $criteria); return $actions; } public function completeAction($action, $params) { $logger = $this->container->get('logger'); $object = $params['entity']; $this->producerService->publishMessage($action, $object); $template = $action->getTemplate(); $twig = new \Twig_Environment(new \Twig_Loader_Array(array())); $tpl = $twig->createTemplate($template); $rendered = $tpl->render($params); $class = get_class($object); $logger->info("ACTION (action_id_{$action->getId()}) {$action->getName()} | Task: '{$rendered}' => {$class}_id_{$object->getId()}"); // $string = file_get_contents("/var/flowdat/ftth/out.log"); // $string .= "### Action id :".$action->getId().PHP_EOL; // $string .= "----------------------".PHP_EOL.$template.PHP_EOL; // $string .= "----------------------".PHP_EOL.$rendered.PHP_EOL.PHP_EOL; // file_put_contents("/var/flowdat/ftth/out.log", $string); } }