Evita – Analisi del codice

Il linguaggio utilizzato è PHP, scelto perché consente di sviluppare applicazioni web in modo semplice e rapido ed è generalmente disponibile su qualsiasi servizio di hosting senza necessità di configurazioni aggiuntive. Per il database è stato utilizzato MySQL, una soluzione solida e leggera, anch’essa comunemente inclusa negli ambienti di hosting.

L’architettura adottata in fase di progettazione è il modello MVC, che consente di separare la logica applicativa dall’interfaccia utente; in alcune parti è stato inoltre utilizzato AJAX per evitare il ricaricamento della pagina.

Nel progetto `index.php` rappresenta il punto di accesso al sito.

In questo file viene istanziata la `Request`, la cui proprietà `url` assume il valore di `$_SERVER[“REQUEST_URI”]`. Se l’URL contiene caratteri “jolly”, questi vengono rimossi, tramite la funzione “clean_jolly_uri”, e utilizzati per scopi specifici.

`AppData` è un oggetto che viene aggiornato a ogni richiesta e salvato nella sessione, tramite la funzione “update_appdata”. Contiene l’URL precedente e quello corrente, l’elenco delle cartelle per ciascuna entità e le cartelle di sistema.

Quando si accede a un URL, `AppData` viene aggiornato a condizione che l’URL non contenga il jolly `!NOBACK!`.

Questa logica è stata introdotta perché, in alcuni casi, aprendo un PDF in un nuovo tab, l’URL veniva salvato nello storico di `AppData`; di conseguenza, effettuando un’operazione di “back”, il PDF veniva riaperto automaticamente.

Successivamente viene istanziato il `Dispatcher`, passandogli la `Request`, ed eseguito il `dispatch` per determinare il nome del controller, l’action e l’elenco dei parametri, secondo la logica:

https://website/controller/action/parametri

Il nome del controller viene poi utilizzato per caricare la classe corrispondente.
Ad esempio, con l’URL `http://miosito/companies/view/2` verrà caricato il file `CompaniesController.php`.

A questo punto viene istanziato il controller, passando al costruttore un’istanza dell’ACL inizializzata con il livello di autorizzazione dell’utente (guest, user, admin). Il costruttore inoltre inizializza l’ACL con i permessi di ogni singolo metodo in modo consente di verificare i permessi di esecuzione dei metodi di un controller.

Il controller viene quindi utilizzato per istanziare un `SecureController`, che esegue il metodo tramite la funzione `call_user_func_array`.

Il `SecureController` intercetta tutte le chiamate ai metodi non esplicitamente definiti tramite il metodo magico `__call`, al quale vengono passati il nome del metodo e i relativi argomenti.

In questo punto vengono recuperati i permessi dall’istanza ACL e, se l’utente è autorizzato, il metodo viene effettivamente eseguito.

Sono stati necessari alcuni accorgimenti per garantire il corretto funzionamento sia su Windows che su Linux.

In particolare, su Linux il caricamento dei file in PHP richiede il rispetto del **case sensitive**, e i percorsi utilizzano lo slash `/`, mentre su Windows viene utilizzato il backslash `\`.

Questa normalizzazione viene gestita tramite la funzione `so_normalize_path`, utilizzata nel dispatcher nella funzione che si occupa di importare la classe del controller.