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 ↗