Systeemarchitectuur & Bedrijfsplatform
Compleet zakelijk webplatform voor de automotive sector ontwikkeld met Symfony 6, Doctrine ORM en EasyAdmin 4. Het combineert een conversiegerichte showroom, een AJAX-gestuurde zoekmachine voor tweedehands auto's, rolgebaseerd beheer (RBAC) en REST API's voor mobiele apps.
┌─────────────────────────────────────────────────────────────────────────────┐
│ 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-zoekmachine
Dynamisch zoeken naar voertuigen op meerdere criteria met noUiSlider zonder paginaherlaad.
Rolgebaseerde toegangscontrole (RBAC)
Strikte scheiding tussen de bevoegdheden van de garagehouder en de medewerkers.
Ontkoppelde REST API
Beveiligde JSON-endpoints die de Flutter-app en externe integraties van data voorzien.
1. Functies van het openbare portaal
Ontwikkeld om de werkplaatsdiensten te presenteren en bezoekers om te zetten in concrete aanvragen:
CMS voor werkplaatsdiensten
Overzichtelijke presentatie van reparaties (mechanica, carrosserie, periodiek onderhoud, aircoservice) met fotobeheer via VichUploader.
Catalogus met tweedehands auto's
Uitgebreide autopagina's (/occasions/vehicule/{id}) met fotocarrousel, technische specificaties en vooraf ingevuld aanvraagformulier.
Klantbeoordelingen & Moderatie
5-sterren beoordelingssysteem met spambeveiliging en handmatige goedkeuring door medewerkers vóór publicatie.
Dynamische openingstijden
Eigen Twig-extensie (HoraireExtension) die automatisch actuele openingstijden in de footer van de hele site toont.
2. Asynchrone AJAX-meervoudige filter
Het facetzoeken combineert SearchData, SearchForm, VehiculeRepository::findSearch() en een asynchrone JavaScript-controller:
| Zoekcriterium |
Interface-element |
Doctrine DQL-query |
| Prijsklasse |
Dual-handle noUiSlider |
p.prix >= :prixmin AND p.prix <= :prixmax |
| Kilometerstand |
Dual-handle noUiSlider |
p.kilometrage >= :kmmin AND p.kilometrage <= :kmmax |
| Bouwjaar / Eerste toelating |
Dual-handle noUiSlider (1970 - 2026) |
p.annee >= :anneemin AND p.annee <= :anneemax |
| Merk & Model |
Dynamisch gekoppelde vervolgkeuzemenu's (/modeles/fetch) |
m.id IN (:marque) AND d.id IN (:modele) |
| Carrosserie, Brandstof & Categorie |
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. Rolgebaseerde toegangscontrole (RBAC)
Beheer van rechten en beheerpanelen via EasyAdmin en Symfony Security-firewalls:
ROLE_ADMIN
Beheerder (Vincent Parrot)
- Beheer van medewerkersaccounts (aanmaken, wachtwoordherstel met strikte complexiteitseisen).
- Volledig CMS-beheer over werkplaatsdiensten, teksten en beeldmateriaal.
- Instellen van wekelijkse openingstijden en registreren van vakantiesluitingen.
- Inzien en beheren van binnengekomen klantberichten.
ROLE_EMPLOYE
Werkplaatsmedewerkers
- Beheer van tweedehands auto's (invoeren, uploaden van meerdere foto's, opties selecteren).
- Automatische toewijzing van de ingelogde medewerker als auteur bij het opslaan in de database.
- Moderatie van klantbeoordelingen (echte reviews goedkeuren of spam afwijzen).
- Geen mogelijkheid om eigen rechten te verhogen naar beheerdersniveau.
4. Headless REST API-endpoints
Beveiligde JSON-endpoints voor de mobiele app en externe koppelingen:
| Method |
Endpoint URL |
Doel van de bewerking |
JSON-responsformaat |
| GET |
/api/vehicules |
Ophalen van de volledige voorraad beschikbare auto's |
JSON Array (JMS getVehicules group) |
| GET |
/api/vehiculesby?page={n} |
Gepagineerde autolijst voor soepel inladen |
{ data: [...], pagination: { ... } } |
| GET |
/api/vehicules/{id} |
Volledige specificaties en fotogalerij voor een specifiek voertuig-ID |
JSON Object (Véhicule, Galerie, Options) |
| GET |
/api/marques-modeles |
Volledige hiërarchie van automerken en bijbehorende modellen |
[{ id, nom, modeles: [{ id, nom }] }] |
| POST |
/api/contact |
Versturen van klantvragen met automatische e-mailnotificatie |
{ status: "success" } (HTTP 201) |
5. Datamodel & Doctrine-relaties
Genormaliseerd relationeel schema met referentiële integriteit in MySQL:
Voertuig- & Media-entiteit
OneToMany-cascade naar VehiculeImage voor meerdere foto's en ManyToMany-koppeling naar Employes.
Voertuigtaxonomie
Genormaliseerde entiteiten voor Marque, Modele, Carburant (Benzine, Diesel, Hybride, Elektrisch), Categorie en Type.
Bedrijfsvoering & Aanvragen
Eigen entiteiten voor Service, Horaire, Temoignage (met goedkeuringsstatus) en Contact.
6. SEO-architectuur & Prestaties
Lokale SEO & Gestructureerde data
Schema.org-metadata voor AutoRepair en Product/Car, gerichte zoekwoorddichtheid voor de regio Toulouse en schone canonieke URL's.
Prestaties & Gedeeltelijke rendering
Asynchrone gedeeltelijke AJAX-rendering om dataverkeer tijdens het filteren te minimaliseren, beeldoptimalisatie en CSRF-beveiliging.