Systemarkitektur & Forretningsplattform
Helhetlig forretningsplattform for bilbransjen utviklet med Symfony 6, Doctrine ORM og EasyAdmin 4. Den kombinerer et salgsorientert utstillingsvindu, en AJAX-drevet bruktbilkatalog, rollebasert administrasjon (RBAC) og REST-API-er for mobilapper.
┌─────────────────────────────────────────────────────────────────────────────┐
│ 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-søkemotor
Dynamisk flerkriteriesøk etter biler med noUiSlider uten ny sidelasting.
Rollebasert tilgangskontroll (RBAC)
Tydelig skille mellom rettighetene til verkstedeieren og de ansatte.
Frakoblet REST-API
Sikre JSON-endepunkter som forsyner Flutter-mobilappen og eksterne integrasjoner.
1. Funksjoner på den offentlige portalen
Utviklet for å presentere verkstedets tjenester og konvertere besøkende til konkrete henvendelser:
CMS for verkstedtjenester
Strukturert fremstilling av reparasjonstjenester (mekanisk arbeid, karosseri, periodisk service, klimaanlegg) med bildeopplasting via VichUploader.
Bruktbilkatalog
Innholdsrike bilsider (/occasions/vehicule/{id}) med bildekarusell, tekniske spesifikasjoner og forhåndsutfylt henvendelsesskjema.
Kundeomtaler & Moderasjon
5-stjerners vurderingssystem med spam-beskyttelse og manuell godkjenning av de ansatte før publisering.
Dynamiske åpningstider
Eget Twig-tillegg (HoraireExtension) som automatisk legger inn oppdaterte åpningstider i bunnteksten på hele nettstedet.
2. Asynkront AJAX-multikriteriefilter
Fasettsøket kombinerer SearchData, SearchForm, VehiculeRepository::findSearch() og en asynkron JavaScript-kontroller:
| Søkekriterium |
Grensesnittelement |
Doctrine DQL-spørring |
| Prisintervall |
Dual-handle noUiSlider |
p.prix >= :prixmin AND p.prix <= :prixmax |
| Kilometerstand |
Dual-handle noUiSlider |
p.kilometrage >= :kmmin AND p.kilometrage <= :kmmax |
| Førstegangsregistrering |
Dual-handle noUiSlider (1970 - 2026) |
p.annee >= :anneemin AND p.annee <= :anneemax |
| Merke & Modell |
Dynamisk koblede nedtrekksmenyer (/modeles/fetch) |
m.id IN (:marque) AND d.id IN (:modele) |
| Karosseri, Drivstoff & Kategori |
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. Rollebasert tilgangskontroll (RBAC)
Håndtering av rettigheter og administrasjonspanel via EasyAdmin og Symfony Security-brannmurer:
ROLE_ADMIN
Administrator (Vincent Parrot)
- Administrasjon av ansattekontoer (opprettelse, tilbakestilling av passord med strenge kompleksitetskrav).
- Full CMS-kontroll over verkstedets tjenestetilbud, tekster og bilder.
- Oppsett av ukentlige åpningstider og registrering av feriestengt.
- Gjennomgang og behandling av mottatte kundehenvendelser.
ROLE_EMPLOYE
Verkstedansatte
- Administrasjon av bruktbiler (opprettelse, opplasting av flere bilder, valg av utstyr).
- Automatisk tildeling av innlogget ansatt som forfatter ved lagring i databasen.
- Moderasjon av kundeomtaler (godkjenne ekte anmeldelser eller avvise useriøse).
- Ingen mulighet til å heve egne rettigheter til administratornivå.
4. Headless REST API-endepunkter
Sikre JSON-endepunkter for mobilapplikasjonen og eksterne integrasjoner:
| Method |
Endpoint URL |
Formål |
JSON-responsformat |
| GET |
/api/vehicules |
Hente hele beholdningen av tilgjengelige biler |
JSON Array (JMS getVehicules group) |
| GET |
/api/vehiculesby?page={n} |
Paginert billiste for smidig innlasting |
{ data: [...], pagination: { ... } } |
| GET |
/api/vehicules/{id} |
Fullstendige spesifikasjoner og bildegalleri for en enkelt bil-ID |
JSON Object (Véhicule, Galerie, Options) |
| GET |
/api/marques-modeles |
Komplett hierarki over bilmerker og tilhørende modeller |
[{ id, nom, modeles: [{ id, nom }] }] |
| POST |
/api/contact |
Sende kundehenvendelse med automatisk utsendelse av e-postvarsel |
{ status: "success" } (HTTP 201) |
5. Datamodell & Doctrine-relasjoner
Normalisert relasjonsskjema med referanseintegritet i MySQL:
Kjøretøy & Medie-entitet
OneToMany-kaskade til VehiculeImage for flere bilder og ManyToMany-kobling til Employes.
Kjøretøytaksonomi
Normaliserte entiteter for Marque, Modele, Carburant (Bensin, Diesel, Hybrid, Elbil), Categorie og Type.
Drift & Henvendelser
Egne entiteter for Service, Horaire, Temoignage (med godkjenningsflagg) og Contact.
6. SEO-arkitektur & Ytelse
Lokal SEO & Strukturerte data
Schema.org-metadata for AutoRepair og Product/Car, målrettet søkeordtetthet for Toulouse-området og rene kanoniske adresser.
Ytelse & Delvis rendering
Asynkron delvis AJAX-rendering for å redusere datatrafikk under filtrering, optimalisert bildehåndtering og CSRF-beskyttelse.