Symfony4 / Sonata : Créer un admin Many/Many

Nous allons ici développer l’ensemble des manipulations pour construire une interface many to many via Sonata.
Nous prendrons comme exemple une gestion de zones avec une liaison par départements. Chaque zones est donc constitué d’un liaison multiple avec la table département.

Sous MysqlWorkbench, cela donne ceci :

Sélection_123

Pour générer les entity, nous utilisons la commande suivante :

php bin/console doctrine:mapping:import "App\Entity" annotation --path=src/Entity
Sélection_124

Ensuite, nous créons les setter et getter dans nos entity via la commande :

php bin/console make:entity --regenerate App
Sélection_125-1

Il ne nous reste plus qu’a générer notre CRUD sonata sans oublier de vider le cache.

php bin/console make:sonata:admin App/Entity/ZxZone
php bin/console cache:clear
Sélection_126

Notre interface sera créé et le service aussi. Il nous faudra tout de même faire quelques manipulations.

1 – Supprimer l’ID de notre formulaire de création d’enregistrement et ajouter notre champs département

//ajouter le use suivant
use Symfony\Bridge\Doctrine\Form\Type\EntityType;

//supprimez l'id, et ajouter la liaison département
  protected function configureFormFields(FormMapper $formMapper): void
    {
       $formMapper
           //->add('id')
            ->add('label')
            ->add('code')
            ->add('departement', EntityType::class, [
                'class' => 'App\Entity\Departement',
                'choice_label' => 'label',
                'label' => 'Départements',
                'required' => false,
                'by_reference' => false,
                'multiple' => true,
                'expanded' => false,
            ]);
    }

Dans la définition de département nous demandons explicitement d’afficher le champs label dans notre liste, via le paramètre « choice_label ».

Cela nous permet d’afficher un label plus sympa que juste l’id. Mais pour cela, il faut ajouter les méthodes suivantes dans l’entity departement.

//Permet d'afficher un nom plus sympa dans les messages du CRUD
    public function __toString(): ?string
    {
        return $this->id." : ".$this->nomClairRiche;
    }
//Permet d'afficher un label dans notre liste de configuration
    public function getLabel(): ?string
    {
        return $this->id." : ".$this->nomClairRiche;
    }
on2many