123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181 |
- <?php
- namespace WorkflowBundle\Event;
- use Symfony\Component\DependencyInjection\ContainerInterface;
- use Symfony\Component\EventDispatcher\EventSubscriberInterface;
- use Symfony\Component\Workflow\Event\Event;
- use Symfony\Component\Workflow\Event\GuardEvent;
- use FTTHBundle\Entity\ONULogOLT;
- use WorkflowBundle\Services\ProducerService;
- # Ayuda:
- # http://blog.eleven-labs.com/en/symfony-workflow-component/
- # https://github.com/lexik/LexikWorkflowBundle
- # https://github.com/fduch/workflow-bundle
- class EventSubscriber implements EventSubscriberInterface
- {
- /**
- * @var ContainerInterface
- */
- private $container;
- /**
- * @var ProducerService
- */
- private $producerService;
- /**
- * @param ContainerInterface $container
- * @param ProducerService $producerService
- */
- public function __construct(ContainerInterface $container, ProducerService $producerService)
- {
- $this->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);
- }
- }
|