123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 |
- <?php
- namespace WorkflowBundle\Command;
- use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand;
- use Symfony\Component\Console\Input\InputInterface;
- use Symfony\Component\Console\Input\InputOption;
- use Symfony\Component\Console\Output\OutputInterface;
- use WorkflowBundle\Utils\WorkFlowEntityClasses;
- class WorkflowApplyCommand extends ContainerAwareCommand
- {
- protected function configure()
- {
- $this
- ->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));
- }
- }
|