Рабочий процесс Symfony инициализируется обратно при переходе на другой маршрут - PullRequest
0 голосов
/ 25 ноября 2018

Я использую рабочий процесс Symfony для своего проекта.Я могу пропустить первый переход и увидеть, что следующие переходы включены с помощью $workflow->getEnabledTransitions($entity);.При переходе на другой маршрут, который вводит следующий переход (часть включенных переходов), создается впечатление, что рабочий процесс инициализировался обратно при проверке разрешенных переходов.

Вот мой файл конфигурации workflow.yaml:

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 Ответ

0 голосов
/ 26 ноября 2018

Я нашел это.Мы должны очистить сущность, чтобы сохранить текущее место:

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

И в сущности у нас есть поле, определенное следующим образом:

/**
 * @ORM\Column(type="string", length=100)
 */
public $currentPlace;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...