1.3. Costruiamo il nostro framework PHP
Esistono molti modi diversi per costruire un framework. Alcuni preferiscono framework molto complessi, altri invece puntano sulla semplicità. In questa serie di articoli costruiremo un framework semplice da usare e da comprendere.
Gli articoli ti aiuteranno a sviluppare il tuo framework personale, diverso da quello che creeremo per il nostro negozio online, ma che potrai facilmente ampliare per creare progetti più grandi. L’obiettivo principale di questa serie è imparare a costruire un proprio framework per qualsiasi CMS.
Pattern di progettazione
Per sviluppare un framework vengono utilizzati vari pattern di progettazione. Un pattern rappresenta una soluzione collaudata e riutilizzabile per risolvere problemi comuni nello sviluppo software. In questo progetto useremo i seguenti pattern:
- Model-View-Controller (MVC)
- Registry
- Singleton
Model-View-Controller (MVC)
MVC è la base del nostro framework. Questo pattern consente di separare l’interfaccia utente dalla logica dell’applicazione. La View (interfaccia utente) interagisce con il Model (dati) attraverso un Controller, che contiene la logica di business necessaria per gestire i dati del modello.
Ad esempio, quando un utente clicca su “Aggiungi al carrello” nella vista, il controller gestisce la richiesta e interagisce con il modello del carrello, aggiungendo il prodotto. Il modello restituisce poi i dati aggiornati, come il numero di articoli nel carrello, e il controller aggiorna la vista.
Nel nostro framework utilizzeremo l’architettura MVC e potremo ampliarla in futuro. I dati saranno gestiti nei modelli e memorizzati nel database. Le tabelle del database corrisponderanno alle proprietà dei modelli, quindi la loro struttura sarà coerente. Possiamo quindi estendere la nostra rappresentazione MVC includendo anche la fase finale: la visualizzazione nel browser.
Registry
Il Registry fornisce un modo per conservare una collezione di oggetti del framework. La necessità di un registro nasce dall’astrazione introdotta dal pattern MVC. Ogni controller e modello (come prodotto, carrello, pagina) deve eseguire alcune operazioni comuni, tra cui:
- Gestire le query al database
- Verificare se l’utente è autenticato
- Passare dati alla View (gestione dei template)
- Inviare email (ad esempio, dopo un acquisto)
- Interagire con il file system (ad esempio, caricare immagini dei prodotti)
La maggior parte dei framework gestisce queste operazioni tramite oggetti dedicati. Il registro consente di memorizzare questi oggetti in un unico punto e di accedervi da qualsiasi parte del framework. Inoltre, gli oggetti nel registro possono interagire tra loro: ad esempio, il gestore dei template può comunicare con il gestore dei file o il sistema di invio email con i template di posta.
Singleton
Il Singleton è uno dei pattern più semplici da comprendere. Il suo scopo principale è garantire che esista una sola istanza di una determinata classe. In genere si utilizza quando è necessario avere un solo oggetto condiviso in tutta l’applicazione, accessibile globalmente.
Un esempio classico è la connessione al database: ne serve una sola, ma deve essere accessibile da tutto il framework.
Struttura generale
Il passo successivo nella costruzione del nostro framework è pianificarne la struttura. Dobbiamo creare una struttura che includa:
- Modelli
- Viste (con la possibilità di utilizzare diversi stili o temi)
- Controller (organizzati in cartelle separate per ciascun modulo)
- Controller amministrativi (per la gestione dei contenuti da parte di admin o moderatori)
- Registro
- Oggetti del registro
- File caricati (uploads)
- Librerie esterne
- Altri file e risorse varie
Tenendo conto di tutto ciò, la struttura delle cartelle del nostro framework sarà la seguente (utilizziamo nomi in inglese, come è consuetudine in PHP):
- Models
- Views
- View A
- Templates
- Images
- JavaScript
- Controllers
- Controller A
- ControllerA
- ControllerAAdmin
- Controller A
- Registry
- Objects
- Database objects
- Assets
- Uploads
- Da ampliare quando aggiungeremo prodotti e immagini!
- Libraries
- Miscellaneous