Nelle ultime due settimane il lavoro svolto è stato parecchio, e rispetto al prototipo dello scorso anno ho migliorato ulteriormente quasi tutti i settori.
Come accennato nel post precedente, sto seguendo tutti i pattern e le best pratice per gestire un sito complesso e completo, quindi con supporto alle ultime tecnologie e agli ultimi standard, oltre a risultare più snello ed efficiente.
Non sono ancora entrato nella parte più critica (ricerca ed import) perchè siamo ancora un po' indietro, ma ho rivisto la gestione delle lingue e degli accessi (url self contained, ovvero il link in alto contiene anche i parametri della pagina).
Ho aggiunto un altro router per gli rss e questi sono al momento quelli supportati:
Codice: Seleziona tutto
- /api -> tutte le chiamate da fuori, come scraper e funzioni
- /rss -> feed di varia natura, per ora solo notizie ma in futuro anche altre sezioni
- /media, /download, /files -> gestione scaricamento file
- /admin -> amministrazione del sito
- /language -> modifica la lingua per le pagine utente
- qualsiasi altro link -> pagina del sito
La cosa interessante di questa divisione è che una modifica ad una pagina non rompe tutto il sito, cosa che invece oggi è tecnicamente possibile, dato che molte logiche sono condivise in pochi file.
Con questa separazione, un cambiamento nell'importazione non toccherà alcun comportamento lato api o lato utente, ovvero non sarà necessario un aggiornamento dei modelli e non saranno invalidate le varie cache.
Il formato include anche dei modificatori, come la selezione lingua nei formati normali (it, en) o posix (it_IT, en_US):
Codice: Seleziona tutto
- /en
- /en_US
- /?lang=en
- /?lang=en_US
- /?language=en
- /?language=en_US
in presenza di questi valori si viene portati in automatico verso la pagina corretta, quando ha senso farlo, rispettando le logiche SEO e codici di stato html (redirect temporaneo, redirect lingua, redirect permanente).
Nello stesso scenario vengono gestiti i vecchi link per ottenere sempre un url pulito.
Lato impostazioni, la lingua ha diverse fasi e priorità in base al router impostato:
- se api o rss (in gergo stateless) -> guida il prefisso (/en/api, /en_US/api), poi i parametri (?lang=en o ?language=en), poi la lingua di base del sito
- se altro (in gergo stateful, ovvero pagine utente) -> guidano preferenze utente, cookies, parametri, preferenze browser, lingua base
La lingua completa (locale posix) viene salvata e gestita anche se non completamente supportata.
Es. salvo lingua spagnola e codice regionale (es_ES) anche se non la supporto ora, ma appena disponibile anche in spagnolo l'utente si vedrà cambiare il sito secondo le proprie preferenze.
Oppure se copio un link da un forum del tipo /en/mame, in automatico passa a /mame perdendo la lingua e non cambiando le mie preferenze di navigazione. Per cambiare la lingua occorrerà sempre passare per language, es. /language/en passa all'inglese, /language/pt_BR o /language/pt-BR, ecc. Teoricamente dovrebbero fare tutti così, poi in realtà nessuno se ne preoccupano e le tue preferenze vanno a farsi benedire...
Questo dettaglio tecnico evita che uno scraper sporchi i cookies di lingua, come accade oggi, e viceversa che le preferenze dell'utente non incidano sulle chiamate esterne fatte dal proprio pc.
Esiste un elenco delle lingue e del loro supporto (parziale, completo, mancante) quindi i vari menu e le opzioni si adegueranno dinamicamente in base all'avanzamento delle traduzioni.
Per le pagine è gestito lo standard i18n (file PO/MO), per i valori (generi o categorie) la cosa è più complessa e valuterò come gestirlo senza impazzire.
Altro pezzo che ho riscritto è la logica e gestione del cookies. Sono ammesse 3 tipologie di cookie (tecnici, applicativi, autenticazione) e quindi ci sono casi in cui si possono pulire alcune categorie e non altre, senza interferenze (es. quelli di autenticazione al logout). Sempre per seguire le regole, tutti i cookies non vengono salvati in chiaro.
Discorso a parte meritano le altre funzioni accessorie come titoli, metadati per SEO e motori di ricerca, cache, indicizzazione. Ho creato tante piccole funzioni che applicano queste regole alle pagine e permettono di avere un sito ben organizzato senza dover rincorrere tutti i vari punti del codice. Per il sitemap.xml c'è una funziona ancora incompleta che genera link e segue tutte le regole per ottenere dati certi su indirizzi unici, canonici, date di effettivo aggiornamento, ecc.
La gestione parametri da url (post e get) ha ora un pattern migliore di singleton che aiuta a rendere più leggibile il codice sorgente. Per es. prima era così.
Codice: Seleziona tutto
$filtro_ricerca = Parameters::fromGet()->getString('ricerca', '');
$arcade_sn = Parameters::fromGet()->getBool('arcade', false);
$voto = Parameters::fromGet()->getInt('voto', 0);
è diventato adesso così:
Codice: Seleziona tutto
$filtro_ricerca = Get::string('ricerca'); // default nullo
$arcade_sn = Get::bool('arcade') ?? false; // default false
$voto = Get::int('voto') ?? 0; // default zero
Questo è un tipico esempio in cui si mescolano funzioni e responsabilità: in php 8.4 possiamo gestire molto meglio l'init dei valori restituiti (default sempre nulli) e quindi avere una leggibilità simile ai programmi moderni come C# 10 con nullable abilitati.
I repository (il database) è migliorato anche lui per evitare qualsiasi possibilità di sql injection, e questa è una cosa molto importante perchè prima costringeva a controllare qualsiasi parametro passato. Oggi se passa per una dimenticanza, la pagina "muore" con un errore grave e non viene eseguito niente. Ovviamente sono errori che si correggono in pochi minuti, ma è comunque una barriera importante contro le intrusioni.
Le pagine statiche principali ormai sono fatte (es. contatti, home, download, crediti) ed alcune hanno ancora il vecchio layout. Cercherò di uniformare prima della pubblicazione, ma il fatto di poter eseguire vecchie pagine senza modifiche sostanziali lato codice mi da la garanzia di poter fare i lavori in maniera graduale.
Probabilmente sono tutti dettagli troppo tecnici che non interessano alla maggior parte dei frequentatori del forum, ma comunque aiutano il sito ad essere leggero e a non farlo collassare su se stesso per le troppe richieste, oppure a consentire un carico supplementare senza sforzo.
Non mi azzardo a fare previsioni per la pubblicazione, ma se continuo con questo ritmo, fine anno diventa un traguardo raggiungibile.