EventSubscriber.php 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  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. public function getActions($event, $eventType, $eventReference) {
  67. $logger = $this->container->get('logger');
  68. $em = $this->container->get("doctrine.orm.entity_manager");
  69. $object = $event->getSubject();
  70. $class = (string) get_class($object);
  71. $filter = array();
  72. $filter['event'] = $eventType;
  73. $filter['objectClass'] = $class;
  74. $filter['workflowType'] = $object->getWorkflowType();
  75. $filter['workflowName'] = $object->getWorkflowName();
  76. $filter['eventReference'] = $eventReference;
  77. $logger->info("EVENT {$eventType}:{$eventReference} => {$class}_id_{$object->getId()}");
  78. $actions = $em->getRepository("WorkflowBundle:Action")->findBy($filter);
  79. return $actions;
  80. }
  81. public function completeAction($action, $params) {
  82. $logger = $this->container->get('logger');
  83. $object = $params['entity'];
  84. $this->producerService->publishMessage($action, $object);
  85. $template = $action->getTemplate();
  86. $twig = new \Twig_Environment(new \Twig_Loader_String());
  87. $rendered = $twig->render($template, $params);
  88. $class = get_class($object);
  89. $logger->info("ACTION (action_id_{$action->getId()}) {$action->getName()} | Task: '{$rendered}' => {$class}_id_{$object->getId()}");
  90. // $string = file_get_contents("/var/flowdat/ftth/out.log");
  91. // $string .= "### Action id :".$action->getId().PHP_EOL;
  92. // $string .= "----------------------".PHP_EOL.$template.PHP_EOL;
  93. // $string .= "----------------------".PHP_EOL.$rendered.PHP_EOL.PHP_EOL;
  94. // file_put_contents("/var/flowdat/ftth/out.log", $string);
  95. }
  96. }