← Back to projects Web application · Automotive

V. Parrot Garage

A vehicle catalogue with advanced filters, vehicle details and image management.

V. Parrot Garage
PROJECT

The project

V. Parrot demonstrates a more application-oriented Symfony architecture, with a vehicle catalogue, advanced filters, structured data and image management.

System Architecture & Enterprise Platform

Full-stack automotive enterprise web platform engineered with Symfony 6, Doctrine ORM, and EasyAdmin 4. It combines a high-conversion public portal, an AJAX-powered used car search engine, role-based administration (RBAC), and headless REST API endpoints consumed by mobile applications.

┌─────────────────────────────────────────────────────────────────────────────┐
│               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
            

AJAX Search Engine

Dynamic multi-criteria vehicle filtering powered by noUiSlider without page reloads.

Role-Based Access Control

Strict separation of administrative and operational privileges between owner and staff.

Decoupled REST API

Secure JSON endpoints feeding the Flutter mobile application and third-party integrations.

1. Public Portal Features

Designed to showcase workshop expertise and turn incoming traffic into qualified leads:

Workshop Services CMS

Itemized repair offerings (mechanical diagnosis, bodywork, routine servicing, air conditioning) with dynamic imagery managed via VichUploader.

Used Vehicle Inventory Catalog

Detailed car product pages (/occasions/vehicule/{id}) with carousel galleries, technical spec badges, and pre-filled inquiry forms.

Customer Reviews & Moderation

5-star rating submission engine with anti-spam length limits and employee validation queues before public release.

Live Opening Hours Injection

Dedicated Twig extension (HoraireExtension) automatically injecting real-time operating schedules into the global footer.

2. AJAX Multi-Criteria Filtering Engine

The faceted search combines SearchData, SearchForm, VehiculeRepository::findSearch(), and an asynchronous JavaScript controller:

Filter Attribute UI Control Doctrine DQL Query
Price Range Dual-handle noUiSlider p.prix >= :prixmin AND p.prix <= :prixmax
Mileage (Km) Dual-handle noUiSlider p.kilometrage >= :kmmin AND p.kilometrage <= :kmmax
Registration Year Dual-handle noUiSlider (1970 - 2026) p.annee >= :anneemin AND p.annee <= :anneemax
Brand & Model Dynamic cascading dependent dropdowns (/modeles/fetch) m.id IN (:marque) AND d.id IN (:modele)
Body Type, Fuel & Category 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. Role-Based Access Control (RBAC)

Fine-grained permissions managed through EasyAdmin and Symfony Security Firewalls:

ROLE_ADMIN Administrator (Vincent Parrot)

  • Employee account governance (provisioning, password resets with enforced complexity policies).
  • Complete CMS control over workshop repair services, text copywriting, and image assets.
  • Weekly operating hours scheduling and holiday closure toggles.
  • Review, inspection, and deletion of customer contact inquiries.

ROLE_EMPLOYE Workshop Employees

  • Used car inventory management (listings creation, multi-image upload, technical option tagging).
  • Automatic attribution of the acting employee as author upon database persistence.
  • Testimonial moderation workflow (approving legitimate customer reviews or rejecting spam).
  • Strict role boundary preventing privilege escalation to Administrator.

4. Headless REST API Endpoints

Secure JSON endpoints powering mobile applications and external data consumers:

Method Endpoint URL Operation Purpose JSON Response Payload
GET /api/vehicules Retrieve complete inventory of available vehicles JSON Array (JMS getVehicules group)
GET /api/vehiculesby?page={n} Paginated vehicle collection for infinite scrolling { data: [...], pagination: { ... } }
GET /api/vehicules/{id} Full specifications and image gallery for a single vehicle ID JSON Object (Véhicule, Galerie, Options)
GET /api/marques-modeles Complete hierarchy of automotive brands and associated models [{ id, nom, modeles: [{ id, nom }] }]
POST /api/contact Submit client inquiry with automatic transactional email dispatch { status: "success" } (HTTP 201)

5. Data Model & Entity Relations

Normalized relational schema with referential integrity constraints under MySQL:

Vehicule & Media Entity

OneToMany cascade mapping to VehiculeImage for multi-photo support and ManyToMany linking to Employes.

Automotive Taxonomy

Relational normalization across Marque, Modele, Carburant (Petrol, Diesel, Hybrid, Electric), Categorie, and Type.

Operations & Interactions

Dedicated entities for Service, Horaire, Temoignage (with boolean approval flag), and Contact.

6. SEO Architecture & Performance Engineering

Local SEO & Structured Data

Schema.org semantic markup for AutoRepair and Product/Car entities, localized keyword density for the Toulouse area, and clean canonical routing.

Performance & Partial Rendering

AJAX-based partial HTML/JSON rendering to minimize payload transfer during filtering, VichUploader image handling, and CSRF protection across all forms.

Explore the Live Platform

Browse the live used vehicle inventory and test the multi-criteria AJAX filtering engine.

Visit Garage Website ↗