Symfony4 / Sonata: Crear un administrador de relación Muchos a Muchos

Desarrollaremos aquí todas las manipulaciones para construir una interfaz de muchos a muchos a través de Sonata.
Tomaremos como ejemplo una gestión de zonas con una conexión por departamentos. Cada zona está así constituida por múltiples conexiones con la tabla de departamentos.

En MysqlWorkbench, se ve así:

Sélection_123

Para generar las entidades, utilizamos el siguiente comando:

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

A continuación, creamos los setters y getters en nuestras entidades utilizando el comando:

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

Ahora solo queda generar nuestro CRUD de Sonata sin olvidar de limpiar la caché.

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

Nuestra interfaz será creada y el servicio también. Todavía tendremos que realizar algunas manipulaciones.

1 - Quitar el ID de nuestro formulario de creación de registros y agregar nuestro campo de departamento

//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,
            ]);
    }

En la definición del departamento pedimos explícitamente mostrar el campo de etiqueta en nuestra lista, a través del parámetro "choice_label".

Esto nos permite mostrar una etiqueta más agradable que solo el id. Pero para esto, debemos agregar los siguientes métodos en la entidad del departamento.

//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