Abbiamo già visto come gestire l’autoloading delle classi in PHP utilizzando la SPL (Standard PHP Library), una tecnica che è ben definita nello standard PSR-4.
Grazie a composer, possiamo sfruttare il suo meccanismo interno di autoloading basato proprio su questo standard evitando così di scrivere l’intero sistema. Se siete alle prime armi sulla questione dell’autoloading delle classi, vi consiglio prima di leggere l’articolo dedicato.
Se invece già utilizziamo composer per i nostri progetti, vediamo come sfruttarlo per caricare dinamicamente le classi che scriviamo.
Definire l’autoloading
Come per la gestione dei pacchetti, dovremmo scrivere le impostazioni per l’autoloading nel file composer.json
. Se ne abbiamo già uno, accodiamo queste impostazioni a require
. Se invece è vuoto, editiamo il file come in questo esempio:
"autoload": { "psr-4": { "App\\": "app/" } }
Nota: se non utilizziamo già composer nel nostro progetto, dobbiamo provvedere a includere il file autoload generato.
Che significa?
Dichiariamo innanzitutto che App
è il nostro vendor
name, che può essere il nostro nome, quello della società o del progetto open source di riferimento. Nel nostro esempio (così come per progetti che magari non renderete open source), ci limitiamo ad un semplice “App” perché non c’è rischio di duplicazione con altri.
Poi specifichiamo il percorso – relativo alla root del progetto – come app/
.
Dichiariamo una classe
Come viene scritto nella specifica PSR-4, quando faremo il loading di una classe in un namespace
così composto:
App/ClasseProva
Il sistema cercherà il file [root del progetto]/app/ClasseProva.php
e lo includerà automaticamente.
Nel file ClasseProva.php
dovremmo naturalmente dichiarare che quella classe si trova nel namespace App:
// ClasseProva.php namespace App; class ClasseProva { // }
Questo discorso vale anche per i sotto-namespace. Sempre utilizzando la nostra impostazione in composer.json
, creeremo delle sotto-directory corrispondenti ai sotto-namespace:
// ClasseTest.php namespace App\Test; class ClasseTest { // }
L’autoloader cercherà il file [root del progetto]/app/Test/ClassTest.php
e lo includerà automaticamente.
Possiamo quindi usare quest’approccio che io definisco write-and-forget senza includere valanghe di file e senza scrivere un autoloader dedicato.