setName('workflow:apply') ->setDescription('Ejecuta una transiciĆn (de un workflow) en una entidad') ->setHelp('Ejecuta un Action (WorflowBundle\Entity\Action) de workflow para una Entidad (WorkflowBundle\Utils\WorkFlowEntityClasses)') ->addOption( 'transition', null, InputOption::VALUE_REQUIRED, 'Transition name' ) ->addOption( 'workflow', null, InputOption::VALUE_REQUIRED, 'Workflow name' ) ->addOption( 'entity', null, InputOption::VALUE_REQUIRED, 'Entity Class. Possible values: ' . implode(', ', WorkFlowEntityClasses::getConstants()) ) ->addOption( 'id', null, InputOption::VALUE_REQUIRED, 'Entity id' ) ; } /** * @param InputInterface $input * @param OutputInterface $output */ protected function execute(InputInterface $input, OutputInterface $output) { $entity_manager = $this->getContainer()->get("doctrine.orm.entity_manager"); $transition = $input->getOption('transition'); $workflow = $input->getOption('workflow'); $entityClass = $input->getOption('entity'); $entityId = $input->getOption('id'); if(!class_exists($entityClass)){ throw new \Exception("Class '$entityClass' not found"); } $entity = $entity_manager->getRepository($entityClass)->find($entityId); if(!$entity){ throw new \Exception("Entity $entityClass with id $entityId not found"); } $wreg = $this->getContainer()->get("workflow.registry"); $wf = $wreg->get($entity, $workflow); $transitions = array_map(function($obj){ return $obj->getName(); }, $wf->getEnabledTransitions($entity)); if(!in_array($transition, $transitions)){ throw new \Exception ("Can't apply transition '$transition', only allowed transitions for this entity are '". implode("','", $transitions). "'"); } $from = array_keys($wf->getMarking($entity)->getPlaces()); $newState = $wf->apply($entity, $transition); $entity_manager->persist($entity); $entity_manager->flush($entity); $to = array_keys($wf->getMarking($entity)->getPlaces()); $output->writeln("Applyed ". $transition . "(".(string)$entity. ") : " . json_encode($from) . " -> " . json_encode($to)); } }