Arquitectura del Sistema & Plataforma Empresarial
Plataforma web automovilística completa construida con Symfony 6, Doctrine ORM y EasyAdmin 4. Integra un portal público enfocado en la conversión, un motor de búsqueda de vehículos de ocasión en AJAX, administración por roles (RBAC) y APIs REST consumidas por apps móviles.
┌─────────────────────────────────────────────────────────────────────────────┐
│ Garage Vincent Parrot — Architecture Dual-Tier │
└──────────────────────────────────────┬──────────────────────────────────────┘
│
┌───────────────────────────┼───────────────────────────┐
▼ ▼ ▼
🚗 Moteur Véhicules & AJAX 👥 Back-Office RBAC 📡 API REST Headless
• noUiSlider (Prix, Km, Année) • EasyAdmin 4 Dashboard • Serializer JMS Groups
• Dropdowns dépendants BDD • Isolation ROLE_ADMIN/EMP • Endpoints paginés (/api)
• Rendu partiel JSON/Twig • Modération avis clients • Support Mobile & Cross-App
• VichUploader multi-photos • Gestion horaires & services • Sécurité CORS & CSRF
Motor de Búsqueda AJAX
Búsqueda dinámica multicriterio con noUiSlider sin necesidad de recargar la página.
Control de Acceso por Roles (RBAC)
Separación estricta de permisos entre el propietario del taller y los empleados.
API REST Desacoplada
Endpoints JSON seguros que alimentan la aplicación móvil en Flutter e integraciones externas.
1. Funcionalidades del Portal Público
Diseñado para exhibir los servicios del taller y convertir visitas en contactos cualificados:
CMS de Servicios de Reparación
Presentación de trabajos mecánicos, chapa, pintura, climatización y mantenimiento periódico con gestión de imágenes mediante VichUploader.
Catálogo de Vehículos de Ocasión
Fichas completas de vehículos (/occasions/vehicule/{id}) con carrusel de imágenes, especificaciones detalladas y formulario de contacto preconfigurado.
Reseñas de Clientes & Moderación
Sistema de valoración de 5 estrellas con validación previa por parte del equipo para evitar reseñas no verificadas.
Horarios de Atención Dinámicos
Extensión personalizada de Twig (HoraireExtension) que inyecta automáticamente los horarios en tiempo real en el pie de página.
2. Motor de Filtrado Multicriterio en AJAX
La búsqueda avanzada combina SearchData, SearchForm, VehiculeRepository::findSearch() y un controlador JavaScript asíncrono:
| Criterio de Búsqueda |
Elemento de Interfaz |
Consulta Doctrine DQL |
| Rango de Precios |
Dual-handle noUiSlider |
p.prix >= :prixmin AND p.prix <= :prixmax |
| Kilometraje |
Dual-handle noUiSlider |
p.kilometrage >= :kmmin AND p.kilometrage <= :kmmax |
| Año de Matriculación |
Dual-handle noUiSlider (1970 - 2026) |
p.annee >= :anneemin AND p.annee <= :anneemax |
| Marca & Modelo |
Menús desplegables dependientes dinámicos (/modeles/fetch) |
m.id IN (:marque) AND d.id IN (:modele) |
| Carrocería, Combustible & Categoría |
Checkboxes (Carrosserie, Énergie) |
t.id IN (:type), a.id IN (:carburant) |
// Rendu partiel asynchrone JSON dans OccasionsController.php
if ($request->get('ajax')) {
return new JsonResponse([
'content' => $this->renderView('occasions/_occasions.html.twig', ['occasions' => $occasions]),
'sorting' => $this->renderView('occasions/_sorting.html.twig', ['occasions' => $occasions]),
'pagination' => $this->renderView('occasions/_pagination.html.twig', ['occasions' => $occasions]),
'prixmin' => $prixmin, 'prixmax' => $prixmax,
'kmmin' => $kmmin, 'kmmax' => $kmmax,
'anneemin' => $anneemin,'anneemax'=> $anneemax
]);
}
3. Control de Acceso Basado en Roles (RBAC)
Gestión de permisos e interfaces administrativas a través de EasyAdmin y firewalls de Symfony Security:
ROLE_ADMIN
Administrador (Vincent Parrot)
- Gestión de cuentas de empleados (creación, reseteo de contraseñas con políticas de complejidad estrictas).
- Control total del CMS para servicios de taller, textos y recursos gráficos.
- Configuración de horarios de apertura semanales y días de cierre por vacaciones.
- Revisión y gestión de los mensajes de contacto recibidos.
ROLE_EMPLOYE
Empleados del Taller
- Gestión del catálogo de vehículos de ocasión (publicación, carga de fotos múltiples, equipamiento).
- Asignación automática del empleado en sesión como autor del vehículo durante el guardado.
- Moderación de testimonios (aprobación de reseñas legítimas o rechazo de spam).
- Imposibilidad de escalar permisos al rol de Administrador.
4. Endpoints de la API REST Headless
Endpoints JSON seguros para la aplicación móvil y herramientas de terceros:
| Method |
Endpoint URL |
Finalidad |
Formato de Respuesta JSON |
| GET |
/api/vehicules |
Obtención del inventario completo de vehículos en venta |
JSON Array (JMS getVehicules group) |
| GET |
/api/vehiculesby?page={n} |
Colección paginada de vehículos para desplazamiento fluido |
{ data: [...], pagination: { ... } } |
| GET |
/api/vehicules/{id} |
Especificaciones y galería completa de un vehículo por su ID |
JSON Object (Véhicule, Galerie, Options) |
| GET |
/api/marques-modeles |
Estructura completa de marcas y modelos disponibles |
[{ id, nom, modeles: [{ id, nom }] }] |
| POST |
/api/contact |
Envío de consultas de clientes con notificación automática por correo |
{ status: "success" } (HTTP 201) |
5. Modelo de Datos & Relaciones de Doctrine
Esquema relacional normalizado con integridad referencial bajo MySQL:
Entidad Vehículo & Galería
Relación OneToMany en cascada hacia VehiculeImage para fotos múltiples y ManyToMany con Employes.
Taxonomía Automotriz
Entidades normalizadas para Marque, Modele, Carburant (Gasolina, Diésel, Híbrido, Eléctrico), Categorie y Type.
Operaciones & Contacto
Entidades para Service, Horaire, Temoignage (con estado de aprobación) y Contact.
6. Estrategia SEO & Rendimiento
SEO Local & Marcado Semántico
Marcado Schema.org para AutoRepair y Product/Car, densidad de palabras clave enfocada en Toulouse y rutas canónicas limpias.
Rendimiento & Renderizado Parcial
Renderizado parcial en AJAX para optimizar el tráfico de datos al filtrar, entrega optimizada de imágenes y protección CSRF.