container = $container; $this->producerService = $producerService; } /** * @return array */ public static function getSubscribedEvents() { return array( 'workflow.leave' => array('leave'), 'workflow.transition' => array('transition'), 'workflow.enter' => array('enter'), 'workflow.guard' => array('guard'), ); } /** * @param Event $event */ 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); } } } /** * @param Event $event */ 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); } } /** * @param Event $event */ 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); } } } /** * @param Event $event */ 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); if ($objectClass == 'FTTHBundle\\Entity\\ONU') { if (is_null($object->getLogOLT())) { $onuLogOlt = new ONULogOLT(); $em->persist($onuLogOlt); $object->setLogOLT($onuLogOlt); } $object->getLogOLT()->setPending(); $em->flush($object->getLogOLT()); } $logger->info("EVENT {$eventName}:{$eventReference} => {$objectClass }_id_{$object->getId()}"); $workflowName = $event->getWorkflowName(); $actions = $em->getRepository("WorkflowBundle:Action") ->findByWorkflowAndEventRef($workflowName, $eventReference); $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", compact('workflowName', 'eventReference')); return $actions; } /** * @param Action $action * @param array $params */ public function completeAction($action, $params) { $logger = $this->container->get('logger'); $object = $params['entity']; $routing_key = ""; if (getenv("AMQP_KEY") !== false) { $routing_key = getenv("AMQP_KEY"); } $this->producerService->publishMessage($action, $object, $routing_key); $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); } }