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í:
Para generar las entidades, utilizamos el siguiente comando:
php bin/console doctrine:mapping:import "App\Entity" annotation --path=src/Entity
A continuación, creamos los setters y getters en nuestras entidades utilizando el comando:
php bin/console make:entity --regenerate App
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
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;
}
Adaptar el ejemplo a la versión instalada
Los ejemplos de Symfony y Sonata permanecen ligados a las versiones indicadas en el artículo. Symfony 4.x y Symfony 6.2 ya no se mantienen: para un proyecto actual, utilice una rama mantenida y la documentación que corresponda exactamente a sus dependencias.
php bin/console about
composer show symfony/framework-bundle sonata-project/admin-bundle
Antes de retomar el código, controle las firmas, los servicios, las rutas y las plantillas correspondientes. Después, agregue una prueba funcional que cubra los permisos, el código HTTP y el resultado visible.
Referencia: versiones de Symfony mantenidas.