Nouveau Composant Workflow avec Symfony 3.2

symfony_logo

La gestion de l’évolution des statuts ou des états  dans un projet est souvent source de manipulation très complexe.

Aujourd’hui avec le composant Workflow  qui a été ajouté à Symfony 3.2, le développement  d’un tel système est plus souple, plus rapide et plus besoin d’ajouter un bundle tiers.

Nous vous présenterons une vue d’ensemble  de ce nouveau composant afin que vous puissiez avoir une idée de son  fonctionnement  avant la sortie officielle de Symfony 3.2 qui est actuellement en version Beta.

Installation

composer require symfony/workflow

Exemple de configuration

Afin d’illustrer notre propos nous allons prendre l’exemple d’un workflow  de « demande d’intervention » , la demande évoluera selon les états suivants : opened, treated, closed . La demande ne pourra pas passer de l'état opened à closed sans être traité au préalable.

Créons donc un fichier App\config\workflow.yml

framework:
    workflows:
        demand:
            marking_store:
                type: property_accessor
                arguments:
                    - state
            supports:
                - AppBundle\Entity\Demand
            places:
                - opened
                - treated
                - closed
            transitions:
                open:
                    from: opened
                    to:   treated
                close:
                    from: treated
                    to:   closed
workflow

Maintenant nous créons notre entité  « Demand » déclaré dans la configuration  «supports» du workflow, elle nous permettra  de faire la liaison afin de suivre le changement d'état de notre demande.

namespace AppBundle\Entity;
 
use Doctrine\ORM\Mapping as ORM;
 
/**
 * @ORM\Table(name="demand")
 */
class Demand
{
/**
     * @ORM\Column(type="integer")
     * @ORM\Id()
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;
    /**
     * @ORM\Column(type="json_array", nullable=true)
     */
    private $state;
 
    public function setState($state)
    {
        $this->state = $state;
    }
 public function getId()
    {
        return $this->id;
    }
    public function getState()
    {
        return $this->state;
    }
}
Demand

Utilisons notre workflow

Nous pouvons utiliser notre workflow maintenant , dans un controller ou dans une vue.

namespace AppBundle\Controller;
use AppBundle\Entity\Demand;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Workflow\Exception\ExceptionInterface;


class DemandController extends Controller
{
    /**
     * @Route("/update-demand/{id}", name="demand_apply")
     * @Method("POST")
     */
     public function updateDemand(Request $request, Demand $demand)
    {
        try {
           // Recuperartion du workflow demand
            $workflow = $this->get('workflow.demand');
    
            $workflow->apply($demand, 'close');

        } catch (ExceptionInterface $e) {
            $this->get('session')->getFlashBag()->add('danger', $e->getMessage());
        }
        ...
    }

}
DemandController

 

Conclusion

Le nouveau composant Workflow est très pratique nous attendons donc la sortie de symfony 3.2 afin de voir plus en détail dans la documentation du composant, toutes ces facettes.  vous trouverez le post de l'annonce  de la création du nouveau  composant workflow  par symfony ici .

Merci.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Captcha *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.