Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Il file composer.json e la gestione dell'autoloading

Impariamo a sfruttare la capacità di Composer di generare i file di autoloading necessari per il caricamento delle classi.
Impariamo a sfruttare la capacità di Composer di generare i file di autoloading necessari per il caricamento delle classi.
Link copiato negli appunti

Una delle caratteristiche che rendono Composer un progetto molto usato è la sua capacità di generare i file di autoloading necessari per il caricamento di classi. Questo significa che non dovremo più preoccuparci di includere il file contenente la classe che vogliamo usare in ogni script che ne fa uso, non dovendoci interessare di quale cartella conterrà fisicamente il codice. Se avete sviluppato in PHP prima dell'avvento dell'autoloading potete capire la grande comodità di questa caratteristica.

L'autoloading del nostro codice

Composer gestisce automaticamente l'autoloading di tutto il codice dei pacchetti che installiamo come dipendenza del nostro progetto, quindi non è necessario configurare niente, basta dichiarare le dipendenze da usare e l'eseguibile farà il resto. Ma non è tutto: è possibile utilizzarlo anche per fare l'autoloading delle nostre classi. Addirittura sarebbe possibile usarlo esclusivamente per questa ragione e già solo questo ne giustificherebbe l'adozione.

Per l'autoloading è possibile specificare singoli file, classmap, strutture che seguono la convenzione PSR-0 oppure la convenzione PSR-4. Quest'ultima è la maniera consigliata per la gestione del codice ed è quella che sarà trattata in questa lezione.

Strutturare il codice seguendo PSR-4

Nella scrittura del codice sarebbe buona norma seguire delle convenzioni per permettere agli strumenti di sviluppo di adeguarsi al nostro lavoro, ad esempio per far gestire al nostro editor di fiducia l'autocompletamento delle classi, se questo è supportato. La prima convenzione che suggerisco di utilizzare è l'utilizzo di una directory unica in cui inserire il nostro lavoro ad esempio src o lib all'interno della root del progetto.

Inoltre oggi per sviluppare in PHP non si può prescindere dall'utilizzo dei namespace quindi dobbiamo scegliere un nome che sarà la radice del fully-qualified class name (FQCN) delle nostre classi, ad esempio Acme. In questo modo tutte le classi che sviluppiamo saranno identificate univocamente e sarà possibile richiamarle in maniera semplice:

<php
use Acme\Logger\FileLogger;

Sempre per convenzione i nomi delle classi dovrebbero iniziare con la lettera maiuscola e seguire la formattazione in camel case, cioè parole unite con la prima lettera di ognuna in maiuscolo. Ogni classe deve essere inserita in un file denominato come la classe stessa più l'estensione .php, il file deve essere inserito in un percorso che inizia nella nostra directory di origine come indicato precedentemente (ad esempio src) e contiene tante sottocartelle quante sono le parti del FQCN.

In pratica si tratta di mappare il FQCN alla struttura delle directory e dei file tenendo sempre a mente il concetto fondamentale di una classe un file. Ovviamente questi percorsi conterranno esclusivamente classi PHP e nessun tipo di codice esecutivo.

Configurare l'autoloading

Se abbiamo seguito la convenzione configurare l'autoloading del nostro codice sarà molto semplice. La proprietà da usare nel file di configurazione composer.json è autoload all'interno della quale specificheremo psr-4.

La proprietà psr-4 può gestire più di una radice di FQCN per cui potremo averne una per il nostro codice personale, una per quella della società per cui lavoriamo, una per indicare un progetto complesso e articolato. Non c'è limite all'utilizzo dei namespace e sfruttare questa potenzialità ci permetterà di dividere concettualmente il nostro codice in modo che in un futuro potremmo riutilizzarne una parte per altri progetti.

Ogni radice di FQCN deve essere indicata con il nome seguito da due caratteri di backslash (\), questi caratteri sono fondamentali per il funzionamento dell'autoloader. Il valore da assegnare alla radice deve essere la nostra directory di origine come indicato precedentemente (ad esempio src). Il file composer.json assomiglierà a questo:

{
    ...
    "autoload": {
        "psr-4": {
            "Acme\\": "src/"
        }
    }
}

Anche in questo caso è supportata una modalità specifica per i file necessari durante la fase di sviluppo, ad esempio per l'autoloading delle classi dei test. Il mio suggerimento è quello di inserire le classi per i test in una directory di origine diversa, come ad esempio test, allo stesso livello gerarchico di src. Quindi con la proprietà autoload-dev, la cui sintassi è identica a quanto visto per autoload, possiamo indicare questo genere di classi che non verranno incluse nell'autoloader ottimizzato per i sistemi di produzione.

Usare l'autoloading generato da composer

Dopo l'aggiunta delle opzioni di configurazione per l'autoload delle nostre classi sarà necessario richiamare l'eseguibile di Composer per rigenerare l'autoload con il comando:

composer dump-autoload

A questo punto Composer si occuperà di generare ad ogni aggiornamento l'autoloader necessario per gestire le classi delle nostre dipendenze e quelle del nostro codice diretto. Per poterlo utilizzare dobbiamo includere un unico file denominato autoload.php, presente nella directory vendor. Il file avrà sempre lo stesso nome anche quando i pacchetti verranno aggiornati.


Ti consigliamo anche