代码之家  ›  专栏  ›  技术社区  ›  evolmind

Symfony工作流在传递到另一个路由时会重新初始化自身

  •  0
  • evolmind  · 技术社区  · 7 年前

    我正在我的项目中使用Symfony工作流。我可以通过第一个转换,并看到下一个转换已启用 $workflow->getEnabledTransitions($entity); . 当传递到引入下一个转换(已启用转换的一部分)的另一个路由时,在检查已启用的转换时,工作流似乎已初始化回自身。

    framework:
        workflows:
            produit_selection:
                type: 'workflow' # or 'state_machine'
                audit_trail:
                    enabled: true
                marking_store:
                    type: 'single_state'
                    arguments:
                        - 'currentPlace'
                supports:
                    - App\Entity\Produit
                initial_place: initiale
                places:
                    - initiale
                    - commande
                    - selectionne
                    - invalide_selection
                transitions:
                    commander:
                        from: initiale
                        to:   commande
                    selectionner:
                        from: commande
                        to:   selectionne
                    invalider_selection:
                        from: commande
                        to:   invalide_selection
    

    commandeProduit 控制器操作:

    /**
     * @Route("/produit/commande/{id<\d+>}", name="produit_commande")
     * @param Request $request
     * @param $id
     * @param ProduitRequestCommandeUpdateHandler $updateHandler
     * @return \Symfony\Component\HttpFoundation\Response
     * @Security("has_role('ROLE_MARKETING')")
     */
    public function commandeProduit(
        Request $request,
        $id,
        ProduitRequestCommandeUpdateHandler $updateHandler,
        Registry $workflows
    ) {
        $repository = $this->getDoctrine()->getRepository(Produit::class);
        /** @var Produit $produit */
        $produit = $repository->find($id);
    
        $produitRequest = ProduitRequest::createFromProduit($produit);
    
        $form = $this->createForm(ProduitCommandeType::class, $produitRequest)->handleRequest($request);
    
        $box = $produit->getBox();
    
        if ($form->isSubmitted() AND $form->isValid()) {
            $produit = $updateHandler->handle($produitRequest, $produit, $box);
    
            if (null === $produit) {
                $this->addFlash(
                    'error',
                    "La commande a été annulée car elle dépasse le budget."
                );
            } elseif ($produit->getCommande()) {
                $workflow = $workflows->get($produit, 'produit_selection');
                //$workflow->getMarking($produit);
    
                if ($workflow->can($produit, 'commander')) {
                    try {
                        $workflow->apply($produit, 'commander');
                    } catch (TransitionException $exception) {
                        // ... if the transition is not allowed
    
                    }
                }
    
                $transitions = $workflow->getEnabledTransitions($produit);
    
                /** @var Transition $transition */
                foreach($transitions as $transition) {
                    $this->addFlash(
                        'error',
                        $transition->getName()
                    );
                }
    
                $this->addFlash(
                    'notice',
                    "La commande du produit a bien été prise en compte avec la quantité " . $produit->getQuantite() . "."
                );
            } else {
                $this->addFlash(
                    'warning',
                    "Le produit n'est pas disponible."
                );
            }
    
            return $this->redirectToRoute("produits_commande");
        }
    
        $fournisseur = $produit->getFournisseur();
    
        return $this->render('produits/commande_produit.html.twig', [
            'box' => $box,
            'fournisseur' => $fournisseur,
            'form' => $form->createView()
        ]);
    }
    

    这是我的 selectionProduit 控制器操作:

    /**
     * @Route("/produit/selection/{id<\d+>}", name="produit_selection")
     * @param Request $request
     * @param $id
     * @param ProduitRequestUpdateHandler $updateHandler
     * @param Registry $workflows
     * @return \Symfony\Component\HttpFoundation\Response
     * @Security("has_role('ROLE_MARKETING')")
     */
    public function selectionProduit(
        Request $request,
        $id,
        ProduitRequestUpdateHandler $updateHandler,
        Registry $workflows
    ) {
        $repository = $this->getDoctrine()->getRepository(Produit::class);
        /** @var Produit $produit */
        $produit = $repository->find($id);
    
        $produitRequest = ProduitRequest::createFromProduit($produit);
    
        $form = $this->createForm(ProduitSelectionType::class, $produitRequest)->handleRequest($request);
    
        if($form->isSubmitted() AND $form->isValid()) {
            $produit = $updateHandler->handle($produitRequest, $produit);
    
            if ($produit->getSelectionne()) {
                $workflow = $workflows->get($produit, 'produit_selection');
                //$workflow->getMarking($produit);
    
                $workflow->can($produit, 'selectionner');
    
                try {
                    $workflow->apply($produit, 'selectionner');
                } catch (TransitionException $exception) {
                    // ... if the transition is not allowed
                }
    
                $transitions = $workflow->getEnabledTransitions($produit);
    
                /** @var Transition $transition */
                foreach($transitions as $transition) {
                    $this->addFlash(
                        'error',
                        $transition->getName()
                    );
                }
    
                $this->addFlash(
                    'notice',
                    "Le produit a bien été sélectionné avec la quantité " . $produit->getQuantite() . ".");
            } else {
                $workflow = $workflows->get($produit, 'produit_selection');
                //$workflow->getMarking($produit);
    
                if ($workflow->can($produit, 'invalider_selection')) {
                    try {
                        $workflow->apply($produit, 'invalider_selection');
                    } catch (TransitionException $exception) {
                        // ... if the transition is not allowed
    
                    }
                }
    
                $transitions = $workflow->getEnabledTransitions($produit);
    
                $this->addFlash(
                    'warning',
                    "Le produit n'a pas été sélectionné.");
            }
    
            return $this->redirectToRoute("produits_selection");
        }
    
        $box = $produit->getBox();
        $fournisseur = $produit->getFournisseur();
    
        return $this->render('produits/selection_produit.html.twig', [
            'box' => $box,
            'fournisseur' => $fournisseur,
            'form' => $form->createView()
        ]);
    }
    

    更改路线后,为什么工作流不转移到下一个位置?如何解决这个问题?谢谢你的帮助。

    1 回复  |  直到 7 年前
        1
  •  1
  •   evolmind    7 年前

    $workflow->apply($produit, 'selectionner');
    $this->getDoctrine()->getManager()->flush();
    

    /**
     * @ORM\Column(type="string", length=100)
     */
    public $currentPlace;