Glossario dei termini

AJAX

Asynchronous JavaScript and XML: una tecnologia per scambiare informazioni tra client e server sul protocollo HTTP senza dover ricaricare l'intera pagina a ogni richiesta. Anche se il nome può far pensare che i dati vengano inviati solo in formato XML, si usa comunemente anche il formato JSON.

Azione del presenter

Parte logica di un presenter che esegue una singola azione. Per esempio mostrare la pagina di un prodotto, disconnettere un utente ecc. Un presenter può avere più azioni.

BOM

Il byte order mark è un carattere iniziale speciale in un file, usato per indicare l'ordine dei byte nella codifica. Alcuni editor lo inseriscono nei file. È praticamente invisibile, ma causa problemi con l'invio dell'output e degli header da PHP. Per rimuoverlo in blocco potete usare Code Checker.

Controller

Il controller elabora le richieste dell'utente e in base a esse richiama la logica applicativa appropriata (cioè il Model) e poi chiede alla View di renderizzare i dati. L'equivalente dei controller nel Nette Framework sono i presenter.

Cross-Site Scripting (XSS)

Il Cross-Site Scripting è un metodo per manomettere i siti web sfruttando gli output non sottoposti a escaping. Un attaccante può così inserire nella pagina codice proprio, modificando la pagina o addirittura ottenendo dati sensibili sui visitatori. La protezione dall'XSS consiste in un escaping coerente e corretto di tutte le stringhe in uscita.

Il Nette Framework introduce la rivoluzionaria tecnologia Context-Aware Escaping, che elimina definitivamente il rischio di Cross-Site Scripting. Esegue automaticamente l'escaping di tutti gli output, così lo sviluppatore non può dimenticarsi nulla.

Cross-Site Request Forgery (CSRF)

Un attacco Cross-Site Request Forgery consiste nell'attirare la vittima su una pagina che, di nascosto, esegue nel browser della vittima una richiesta verso un server su cui la vittima è connessa. Il server crede che la richiesta sia stata fatta volontariamente dalla vittima. Sotto l'identità della vittima esegue quindi un'azione a sua insaputa. Può trattarsi di modificare o cancellare dati, inviare un messaggio ecc.

Il Nette Framework protegge automaticamente form e segnali nei presenter da questo tipo di attacco, impedendo che vengano inviati o richiamati da un altro dominio.

Cross-Origin Resource Sharing (CORS)

CORS è un meccanismo di sicurezza che permette a una pagina web di fare richieste JavaScript verso un dominio diverso da quello da cui la pagina è stata caricata. Senza CORS i browser bloccano queste richieste per motivi di sicurezza.

Se per esempio il vostro sito gira su https://myapp.com e prova a ottenere dati da https://api.example.com con JavaScript (AJAX, Fetch API), il browser verifica se il server dell'API consente questa richiesta cross-origin. Il server dell'API deve rispondere con header HTTP speciali, per esempio Access-Control-Allow-Origin: https://myapp.com, per concedere il permesso.

Dependency Injection

La Dependency Injection (DI) è un design pattern che stabilisce come separare la creazione degli oggetti dalle loro dipendenze. Significa che una classe non è responsabile della creazione o dell'inizializzazione delle proprie dipendenze; queste vengono invece fornite da codice esterno (che può essere un container DI). Il vantaggio sta nella maggiore flessibilità del codice, nella sua migliore comprensibilità e in un test più facile dell'applicazione, perché le dipendenze sono facilmente sostituibili e isolate dalle altre parti del codice. Di più nel capitolo Che cos'è la dependency injection?

Dependency Injection Container

Un container di dependency injection (anche container DI o container IoC) è uno strumento che si occupa della creazione e dell'amministrazione delle dipendenze (o servizi) all'interno di un'applicazione. Il container ha di solito una configurazione che definisce quali classi dipendono da altre, quali implementazioni concrete delle dipendenze usare e come queste dipendenze vadano create. Il container crea poi questi oggetti e li fornisce alle classi che ne hanno bisogno. Di più nel capitolo Che cos'è un container DI?

Escaping

L'escaping è la conversione dei caratteri che in un dato contesto hanno un significato speciale in altre sequenze corrispondenti. Esempio: vogliamo scrivere le virgolette dentro una stringa racchiusa tra virgolette. Poiché nel contesto della stringa le virgolette hanno un significato speciale e scriverle semplicemente verrebbe interpretato come la fine della stringa, bisogna scriverle con una sequenza corrispondente diversa. La sequenza esatta è determinata dalle regole del contesto.

Filtro

Nei template per filtro si intende di solito una funzione che aiuta a modificare o riformattare i dati nella loro forma finale. I template offrono diversi filtri standard.

Invalidazione

Notifica a uno Snippet che deve essere ridisegnato. In un altro contesto significa anche cancellare il contenuto della cache.

JSON

Un formato di scambio dati basato sulla sintassi di JavaScript (ne è un sottoinsieme). La specifica esatta la trovate su www.json.org.

Componente

Parte riutilizzabile di un'applicazione. Può essere una parte visiva di una pagina, come descritto nel capitolo Scrivere componenti, oppure con il termine componente si intende anche la classe Component (un componente del genere non deve per forza essere visivo).

Caratteri di controllo

I caratteri di controllo sono caratteri invisibili che possono comparire nel testo ed eventualmente causare problemi. Per rimuoverli in blocco dai file potete usare Code Checker, per rimuoverli da una variabile la funzione Strings::normalize().

Eventi

Un evento è una situazione attesa all'interno di un oggetto. Quando si verifica, vengono chiamati i cosiddetti handler, cioè callback che reagiscono all'evento (esempio). Un evento può essere per esempio l'invio di un form, il login di un utente ecc. Gli eventi sono quindi una forma di Inversion of Control.

Il login dell'utente avviene per esempio nel metodo Nette\Security\User::login(). L'oggetto User ha la variabile pubblica $onLoggedIn, che è un array a cui chiunque può aggiungere un callback. Quando l'utente si connette, il metodo login() chiama tutti i callback dell'array. Il formato del nome della variabile onXyz è una convenzione usata in tutto Nette.

Latte

Uno dei sistemi di template più avanzati.

Model

Il model è il nucleo di dati e soprattutto funzionale dell'intera applicazione. Contiene tutta la logica applicativa (si usa anche il termine logica di business). È la M di MVC o MVP. Qualsiasi azione dell'utente (login, aggiunta di merce al carrello, modifica di un valore nel database) rappresenta un'azione del model.

Il model gestisce il proprio stato interno e offre verso l'esterno un'interfaccia fissa. Chiamando le funzioni di questa interfaccia possiamo interrogarne o modificarne lo stato. Il model non sa dell'esistenza della View né del Controller.

Model-View-Controller

Un'architettura software nata dalla necessità di separare, nelle applicazioni con interfaccia grafica, il codice di gestione (Controller) dal codice della logica applicativa (Model) e dal codice che mostra i dati (View). Questo rende l'applicazione più chiara, facilita lo sviluppo futuro e permette di testare separatamente le singole parti.

Model-View-Presenter

Un'architettura basata su Model-View-Controller.

Modulo

Un modulo rappresenta una parte logica dell'applicazione. Nella disposizione tipica è un gruppo di presenter e template che si occupano di un'area di funzionalità specifica. I moduli si collocano in directory separate, per esempio Front/, Admin/ oppure Shop/.

Un e-shop si può per esempio dividere in:

  • Frontend (Shop/) per sfogliare i prodotti e acquistare
  • Area clienti (Customer/) per gestire gli ordini
  • Amministrazione (Admin/) per gli operatori

Tecnicamente sono normali directory, ma grazie a una strutturazione chiara aiutano a scalare l'applicazione. Il presenter Admin:Product:List si troverebbe quindi fisicamente per esempio nella directory app/Presentation/Admin/Product/List/ (vedi mappatura dei presenter).

Namespace

Lo spazio dei nomi, parte del linguaggio PHP dalla versione 5.3 e di alcuni altri linguaggi di programmazione, permette di usare classi con lo stesso nome in librerie diverse senza collisioni di nomi. Vedi la documentazione di PHP.

Presenter

Un presenter è un oggetto che prende una richiesta tradotta dal router a partire da una richiesta HTTP e genera una risposta. La risposta può essere una pagina HTML, un'immagine, un documento XML, un file su disco, JSON, un redirect o qualsiasi cosa vi venga in mente.

Di solito con il termine presenter si intende un discendente della classe Nette\Application\UI\Presenter. In base alle richieste in arrivo esegue le azioni corrispondenti e renderizza i template.

Router

Un traduttore bidirezionale tra richiesta HTTP / URL e azione del presenter. Bidirezionale significa che dalla richiesta HTTP si può ricavare l'Azione del presenter e, viceversa, per un'azione si può generare l'URL corrispondente. Di più nel capitolo sul routing degli URL.

I cookie SameSite offrono un meccanismo per riconoscere che cosa ha portato al caricamento della pagina. Può avere tre valori: Lax, Strict e None (quest'ultimo richiede HTTPS). Se la richiesta della pagina arriva direttamente dal sito, oppure l'utente apre la pagina digitandola nella barra degli indirizzi o cliccando un segnalibro, il browser invia al server tutti i cookie (cioè con i flag Lax, Strict e None). Se l'utente arriva al sito tramite un link da un altro sito, al server vengono passati i cookie con i flag Lax e None. Se la richiesta nasce in altro modo, per esempio dall'invio di un form POST da un altro sito, dal caricamento dentro un iframe, tramite JavaScript ecc., vengono inviati solo i cookie con il flag None.

Servizio

Nel contesto della dependency injection, per servizio si intende un oggetto creato e gestito dal container DI. Un servizio si può sostituire facilmente con un'altra implementazione, per esempio a scopo di test o per cambiare il comportamento dell'applicazione, senza dover modificare il codice che lo usa.

Snippet

Uno snippet, cioè una parte di pagina che si può ridisegnare in modo indipendente durante una richiesta AJAX.

View

La view è il livello dell'applicazione responsabile di mostrare il risultato di una richiesta. Di solito usa un sistema di template e sa come mostrare i singoli componenti o i risultati ottenuti dal model.

versione: 4.x