← Volver a los proyectos Aplicación web · Automoción

V. Parrot Garage

Un catálogo de vehículos con filtros avanzados, detalles del vehículo y gestión de imágenes.

V. Parrot Garage
PROYECTO

El proyecto

V. Parrot demuestra una arquitectura Symfony más orientada a la aplicación, con un catálogo de vehículos, filtros avanzados, datos estructurados y gestión de imágenes.

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.

Visitar la Plataforma en Vivo

Explora el catálogo de vehículos de ocasión y prueba los filtros en tiempo real.

Visitar el Sitio Web del Taller ↗