EventSubscriber.php 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. <?php
  2. namespace WorkflowBundle\Event;
  3. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  4. use Symfony\Component\Workflow\Event\Event;
  5. use Symfony\Component\Workflow\Event\GuardEvent;
  6. use WorkflowBundle\Services\ProducerService;
  7. use Symfony\Component\DependencyInjection\ContainerInterface;
  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. private $container;
  15. private $producerService;
  16. /**
  17. * @param ContainerInterface $container
  18. */
  19. public function __construct(ContainerInterface $container, ProducerService $producerService)
  20. {
  21. $this->container = $container;
  22. $this->producerService = $producerService;
  23. }
  24. public static function getSubscribedEvents()
  25. {
  26. return array(
  27. 'workflow.leave' => array('leave'),
  28. 'workflow.transition' => array('transition'),
  29. 'workflow.enter' => array('enter'),
  30. 'workflow.guard' => array('guard')
  31. );
  32. }
  33. public function leave(Event $event)
  34. {
  35. foreach ($event->getTransition()->getFroms() as $place) {
  36. $actions = $this->getActions($event, 'leave', $place);
  37. foreach($actions as $k => $action) {
  38. $params = array('entity'=>$event->getSubject());
  39. $this->completeAction($action, $params);
  40. }
  41. }
  42. }
  43. public function transition(Event $event)
  44. {
  45. $transitionName = $event->getTransition()->getName();
  46. $actions = $this->getActions($event, 'transition', $transitionName);
  47. foreach($actions as $k => $action) {
  48. $params = array('entity'=>$event->getSubject());
  49. $this->completeAction($action, $params);
  50. }
  51. }
  52. public function enter(Event $event)
  53. {
  54. foreach ($event->getTransition()->getTos() as $place) {
  55. $actions = $this->getActions($event, 'enter', $place);
  56. foreach($actions as $k => $action) {
  57. $params = array('entity'=>$event->getSubject());
  58. $this->completeAction($action, $params);
  59. }
  60. }
  61. }
  62. public function guard(GuardEvent $event)
  63. {
  64. //$event->setBlocked(true);
  65. }
  66. /**
  67. * @param Event $event
  68. * @param string $eventName
  69. * @param string $eventReference
  70. *
  71. * @return array
  72. */
  73. public function getActions($event, $eventName, $eventReference)
  74. {
  75. $logger = $this->container->get('logger');
  76. $em = $this->container->get("doctrine.orm.entity_manager");
  77. $object = $event->getSubject();
  78. $objectClass = (string) get_class($object);
  79. $logger->info("EVENT {$eventName}:{$eventReference} => {$objectClass }_id_{$object->getId()}");
  80. $criteria = array("workflowName" => $event->getWorkflowName(), "eventReference" => $eventReference
  81. );
  82. $actions = $em->getRepository("WorkflowBundle:Action")->findBy($criteria);
  83. $new_actions = array();
  84. foreach($actions as $action){
  85. if(in_array($eventName, $action->getEvent()) AND is_a($object, $action->getObjectClass())){
  86. $new_actions[] = $action;
  87. }
  88. }
  89. $actions = $new_actions;
  90. $logger->info("EVENT Found ". count($actions) . " actions to apply", $criteria);
  91. return $actions;
  92. }
  93. public function completeAction($action, $params)
  94. {
  95. $logger = $this->container->get('logger');
  96. $object = $params['entity'];
  97. $routing_key = "";
  98. if(getenv("AMQP_KEY") !== false){
  99. $routing_key = getenv("AMQP_KEY");
  100. }
  101. $this->producerService->publishMessage($action, $object, $routing_key);
  102. $template = $action->getTemplate();
  103. $twig = new \Twig_Environment(new \Twig_Loader_Array(array()));
  104. $tpl = $twig->createTemplate($template);
  105. $rendered = $tpl->render($params);
  106. $class = get_class($object);
  107. $logger->info("ACTION (action_id_{$action->getId()}) {$action->getName()} | Task: '{$rendered}' => {$class}_id_{$object->getId()}");
  108. // $string = file_get_contents("/var/flowdat/ftth/out.log");
  109. // $string .= "### Action id :".$action->getId().PHP_EOL;
  110. // $string .= "----------------------".PHP_EOL.$template.PHP_EOL;
  111. // $string .= "----------------------".PHP_EOL.$rendered.PHP_EOL.PHP_EOL;
  112. // file_put_contents("/var/flowdat/ftth/out.log", $string);
  113. }
  114. }