EventSubscriber.php 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. <?php
  2. namespace WorkflowBundle\Event;
  3. use Symfony\Component\DependencyInjection\ContainerInterface;
  4. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  5. use Symfony\Component\Workflow\Event\Event;
  6. use Symfony\Component\Workflow\Event\GuardEvent;
  7. use WorkflowBundle\Services\ProducerService;
  8. # Ayuda:
  9. # http://blog.eleven-labs.com/en/symfony-workflow-component/
  10. # https://github.com/lexik/LexikWorkflowBundle
  11. # https://github.com/fduch/workflow-bundle
  12. class EventSubscriber implements EventSubscriberInterface
  13. {
  14. /**
  15. * @var ContainerInterface
  16. */
  17. private $container;
  18. /**
  19. * @var ProducerService
  20. */
  21. private $producerService;
  22. /**
  23. * @param ContainerInterface $container
  24. * @param ProducerService $producerService
  25. */
  26. public function __construct(ContainerInterface $container, ProducerService $producerService)
  27. {
  28. $this->container = $container;
  29. $this->producerService = $producerService;
  30. }
  31. /**
  32. * @return array
  33. */
  34. public static function getSubscribedEvents()
  35. {
  36. return array(
  37. 'workflow.leave' => array('leave'),
  38. 'workflow.transition' => array('transition'),
  39. 'workflow.enter' => array('enter'),
  40. 'workflow.guard' => array('guard'),
  41. );
  42. }
  43. /**
  44. * @param Event $event
  45. */
  46. public function leave(Event $event)
  47. {
  48. foreach ($event->getTransition()->getFroms() as $place) {
  49. $actions = $this->getActions($event, 'leave', $place);
  50. foreach ($actions as $k => $action) {
  51. $params = array(
  52. 'entity' => $event->getSubject(),
  53. );
  54. $this->completeAction($action, $params);
  55. }
  56. }
  57. }
  58. /**
  59. * @param Event $event
  60. */
  61. public function transition(Event $event)
  62. {
  63. $transitionName = $event->getTransition()->getName();
  64. $actions = $this->getActions($event, 'transition', $transitionName);
  65. foreach ($actions as $k => $action) {
  66. $params = array(
  67. 'entity' => $event->getSubject(),
  68. );
  69. $this->completeAction($action, $params);
  70. }
  71. }
  72. /**
  73. * @param Event $event
  74. */
  75. public function enter(Event $event)
  76. {
  77. foreach ($event->getTransition()->getTos() as $place) {
  78. $actions = $this->getActions($event, 'enter', $place);
  79. foreach ($actions as $k => $action) {
  80. $params = array(
  81. 'entity' => $event->getSubject(),
  82. );
  83. $this->completeAction($action, $params);
  84. }
  85. }
  86. }
  87. /**
  88. * @param Event $event
  89. */
  90. public function guard(GuardEvent $event)
  91. {
  92. //$event->setBlocked(true);
  93. }
  94. /**
  95. * @param Event $event
  96. * @param string $eventName
  97. * @param string $eventReference
  98. *
  99. * @return array
  100. */
  101. public function getActions($event, $eventName, $eventReference)
  102. {
  103. $logger = $this->container->get('logger');
  104. $em = $this->container->get("doctrine.orm.entity_manager");
  105. $object = $event->getSubject();
  106. $objectClass = (string)get_class($object);
  107. if ($objectClass == 'FTTHBundle\\Entity\\ONU') {
  108. $object->getLogOLT()->setPending();
  109. $em->flush();
  110. }
  111. $logger->info("EVENT {$eventName}:{$eventReference} => {$objectClass }_id_{$object->getId()}");
  112. $workflowName = $object->getWorkflowName();
  113. $actions = $em->getRepository("WorkflowBundle:Action")
  114. ->findByWorkflowAndEventRef($workflowName, $eventReference);
  115. $new_actions = array();
  116. foreach ($actions as $action) {
  117. if (in_array($eventName, $action->getEvent()) AND is_a($object, $action->getObjectClass())) {
  118. $new_actions[] = $action;
  119. }
  120. }
  121. $actions = $new_actions;
  122. $logger->info("EVENT Found " . count($actions) . " actions to apply", compact('workflowName', 'eventReference'));
  123. return $actions;
  124. }
  125. /**
  126. * @param Action $action
  127. * @param array $params
  128. */
  129. public function completeAction($action, $params)
  130. {
  131. $logger = $this->container->get('logger');
  132. $object = $params['entity'];
  133. $routing_key = "";
  134. if (getenv("AMQP_KEY") !== false) {
  135. $routing_key = getenv("AMQP_KEY");
  136. }
  137. $this->producerService->publishMessage($action, $object, $routing_key);
  138. $template = $action->getTemplate();
  139. $twig = new \Twig_Environment(new \Twig_Loader_Array(array()));
  140. $tpl = $twig->createTemplate($template);
  141. $rendered = $tpl->render($params);
  142. $class = get_class($object);
  143. $logger->info("ACTION (action_id_{$action->getId()}) {$action->getName()} | Task: '{$rendered}' => {$class}_id_{$object->getId()}");
  144. // $string = file_get_contents("/var/flowdat/ftth/out.log");
  145. // $string .= "### Action id :".$action->getId().PHP_EOL;
  146. // $string .= "----------------------".PHP_EOL.$template.PHP_EOL;
  147. // $string .= "----------------------".PHP_EOL.$rendered.PHP_EOL.PHP_EOL;
  148. // file_put_contents("/var/flowdat/ftth/out.log", $string);
  149. }
  150. }