1 Architettura
- Stack: PHP 7.4+/8 lato server, JavaScript vanilla ES modules lato client, MySQL/MariaDB.
- Sito pubblico: front controller PHP + SPA, pannello admin (SPA) e API REST che le serve entrambe.
- Configurazione unica (
config.php): percorso, dominio, database, mail e limiti di upload.
PHPPDOVanilla JSES modulesApache/.htaccess2 Backend / API REST
- PDO con prepared statement ovunque (anti SQL-injection), connessione centralizzata.
- Router custom con parametri dinamici (
/annunci/:id,/annunci/slug/:slug) e rotte marcabili come protette. - Classi core:
Request,Response(JSON),Router,Database, middlewareAutheCors. - Pattern Model → Controller → Route con whitelist dei campi scrivibili (anti mass-assignment).
- Entità: annunci (+ foto), slide hero, pagine statiche, contatti, utenti, impostazioni agenzia, traduzioni.
3 Sicurezza
- Autenticazione JWT (HS256) con token in cookie HttpOnly (
SameSite=Strict,Securein HTTPS): il JS non vede mai il token → resistente all'XSS. - Secret JWT auto-generato e unico per installazione, salvato fuori dal web e rotabile.
- Password con bcrypt + password policy (min 8, lettere+numeri, blocklist, no email).
- Ruoli admin/editor applicati lato server (403 sugli endpoint riservati).
- Rate limiting anti brute-force (login) e anti-spam (contatti) + honeypot.
- Validazioni centralizzate su tutti gli endpoint di scrittura, coerenti coi limiti del DB.
- CSP con nonce, hardening
.htaccess(blocco cartelle interne e file sensibili, no directory listing), protezione anti header-injection nelle email.
4 Sito pubblico
- Front controller PHP che compila il
<head>per pagina, poi SPA con History API e URL parlanti (/slug). - Home con hero slider (immagini/video, testi per slide), ricerca, pillole tipologie, ultimi annunci.
- Catalogo con filtri, schede con gallery, mappa e prezzo; pagine statiche; contatti con privacy e mappa "Dove siamo".
- Flusso contatto → annuncio: la richiesta viene precompilata e collegata all'immobile (visibile in admin, citato in email).
5 Pannello admin
- SPA a moduli (router hash, layout condiviso, una vista per file).
- CRUD completo: annunci + foto (upload/riordino), hero slider (upload singolo e multiplo), pagine, contatti, dati agenzia, utenti.
- Tema chiaro/scuro, sidebar comprimibile, ricerca con ⌘K, toast e conferme non bloccanti, skeleton, upload logo.
6 SEO
- Meta server-side per pagina (title, description, canonical,
noindex), URL parlanti,robots.txt, sitemap.xml dinamica. - SEO sociale: Open Graph completo (site_name, locale + alternate, image), Twitter Card, immagine di ripiego.
- Dati strutturati JSON-LD:
RealEstateAgentsu ogni pagina +Residencesulle schede.
7 Internazionalizzazione
- Interfaccia IT/EN con switch immediato (dizionario, cookieless).
- Contenuti traducibili (annunci e pagine) dall'admin con linguette IT/EN e fallback automatico all'italiano; API con parametro
lang.
8 Performance & PWA
- Font self-hosted (DM Sans, Playfair, IBM Plex Sans/Mono) in woff2 con preload → niente Google Fonts (privacy + velocità).
- Nessun bundle, poche richieste, immagini ridimensionate all'upload.
- PWA installabile: manifest, set completo di favicon + icone 192/512, theme-color.
- Analytics privacy-friendly (Umami, cookieless).
9 Accessibilità
- Skip-link,
<main>focusabile, landmark semantici,role="search",aria-livesugli esiti, menu mobile conaria-expanded. - Focus-visible, contrasti curati,
prefers-reduced-motionrispettato, label sempre presenti.
10 Qualità & deploy
- Test senza dipendenze: runner PHP con unit test (JWT, validazioni, password policy, slug) + smoke test HTTP degli endpoint (login, CRUD, 401/403/422, permessi).
- Installazione con un file + import di 3 migration e seed; secret e favicon già pronti.
- Funziona in sottocartella o nella root del dominio; repository Git con esclusioni di upload, chiavi e dati volatili.