Преглед изворни кода

Listener para asignar workflow y currentState

Guillermo Espinoza пре 7 година
родитељ
комит
349792b405
2 измењених фајлова са 40 додато и 0 уклоњено
  1. 35 0
      EventListener/WorkflowInterfaceListener.php
  2. 5 0
      Resources/config/services.yml

+ 35 - 0
EventListener/WorkflowInterfaceListener.php

@@ -0,0 +1,35 @@
+<?php
+
+namespace WorkflowBundle\EventListener;
+
+use WorkflowBundle\Entity\Interfaces\WorkflowInterface;
+use Doctrine\Common\Persistence\Event\LifecycleEventArgs;
+use Doctrine\ORM\EntityManager;
+
+class WorkflowInterfaceListener
+{
+    
+    /**
+     * @param LifecycleEventArgs $event
+     */
+    public function prePersist(LifecycleEventArgs $event)
+    {
+        $em = $event->getEntityManager();
+        $entity = $event->getEntity();
+        if ($entity instanceof WorkflowInterface) {
+            $workflow = $entity->getWorkflow();
+            // La entidad no tiene workflow, busco por la clase y le asigno el primero
+            if (is_null($workflow)) {
+                $workflows = $em->getRepository('WorkflowBundle:Workflow')->findAllByClass(get_class($entity));
+                if (count($workflows)) {
+                    $workflow = $workflows[array_keys($workflows)[0]];
+                    $entity->setWorkflow($workflow);
+                }
+            }
+            if (!is_null($workflow)) {
+                $entity->setCurrentState($workflow->getInitialPlace($entity));
+            }
+        }
+    }
+
+}

+ 5 - 0
Resources/config/services.yml

@@ -39,3 +39,8 @@ services:
             - { name: doctrine.event_subscriber, connection: default }       
     # Lo que se pase en arguments se setea en el campo twigParams de la entity Action
 #        arguments: ['@service_container']
+
+    workflow.workflow_interface.listener:
+        class: WorkflowBundle\EventListener\WorkflowInterfaceListener
+        tags:
+            - { name: doctrine.event_listener, event: prePersist }