EventSubscriber.php 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  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 Symfony\Component\DependencyInjection\ContainerInterface;
  7. # Ayuda:
  8. # http://blog.eleven-labs.com/en/symfony-workflow-component/
  9. # https://github.com/lexik/LexikWorkflowBundle
  10. # https://github.com/fduch/workflow-bundle
  11. class EventSubscriber implements EventSubscriberInterface
  12. {
  13. private $container;
  14. /**
  15. * @param ContainerInterface $container
  16. */
  17. public function __construct(ContainerInterface $container)
  18. {
  19. $this->container = $container;
  20. }
  21. public static function getSubscribedEvents()
  22. {
  23. return array(
  24. 'workflow.leave' => array('leave'),
  25. 'workflow.transition' => array('transition'),
  26. 'workflow.enter' => array('enter'),
  27. 'workflow.guard' => array('guard')
  28. );
  29. }
  30. public function leave(Event $event)
  31. {
  32. foreach ($event->getTransition()->getFroms() as $place) {
  33. $actions = $this->getActions($event, 'leave', $place);
  34. foreach($actions as $k => $action) {
  35. $params = array('entity'=>$event->getSubject());
  36. $this->completeAction($action, $params);
  37. }
  38. }
  39. }
  40. public function transition(Event $event)
  41. {
  42. $transitionName = $event->getTransition()->getName();
  43. $actions = $this->getActions($event, 'transition', $transitionName);
  44. foreach($actions as $k => $action) {
  45. $params = array('entity'=>$event->getSubject());
  46. $this->completeAction($action, $params);
  47. }
  48. }
  49. public function enter(Event $event)
  50. {
  51. foreach ($event->getTransition()->getTos() as $place) {
  52. $actions = $this->getActions($event, 'enter', $place);
  53. foreach($actions as $k => $action) {
  54. $params = array('entity'=>$event->getSubject());
  55. $this->completeAction($action, $params);
  56. }
  57. }
  58. }
  59. public function guard(GuardEvent $event)
  60. {
  61. //$event->setBlocked(true);
  62. }
  63. public function getActions($event, $eventType, $eventReference) {
  64. $logger = $this->container->get('logger');
  65. $em = $this->container->get("doctrine.orm.entity_manager");
  66. $object = $event->getSubject();
  67. $class = (string) get_class($object);
  68. $filter = array();
  69. $filter['event'] = $eventType;
  70. $filter['objectClass'] = $class;
  71. $filter['workflowType'] = $object->getWorkflowType();
  72. $filter['workflowName'] = $object->getWorkflow();
  73. $filter['eventReference'] = $eventReference;
  74. $logger->info("WORKFLOW-ACTION {$object->getWorkflowType()}.{$object->getWorkflow()} => EVENT {$eventType}:{$eventReference} => CLASS {$class}_id_{$object->getId()}");
  75. $actions = $em->getRepository("WorkflowBundle:Action")->findBy($filter);
  76. return $actions;
  77. }
  78. public function completeAction($action, $params) {
  79. $logger = $this->container->get('logger');
  80. $template = $action->getTemplate();
  81. $twig = new \Twig_Environment(new \Twig_Loader_String());
  82. $rendered = $twig->render($template, $params);
  83. $object = $params['entity'];
  84. $class = get_class($object);
  85. $logger->info("WORKFLOW-ACTION {$class}_id_{$object->getId()} | action_id_{$action->getId()} => Render: {$rendered}");
  86. $string = file_get_contents("/var/flowdat/ftth/out.log");
  87. $string .= "### Action id :".$action->getId().PHP_EOL;
  88. $string .= "----------------------".PHP_EOL.$template.PHP_EOL;
  89. $string .= "----------------------".PHP_EOL.$rendered.PHP_EOL.PHP_EOL;
  90. file_put_contents("/var/flowdat/ftth/out.log", $string);
  91. }
  92. }