Effettuare il caricamento automatico di classi con Composer, il noto gestore di dipendenze PHP
Ci siamo già occupati di autoloading delle classi PHP in un precedente articolo, che ti invito a leggere.
Il caricamento automatico delle classi è diventato un apetto importante nella programmazione moderna: con questo sistema non dobbiamo più preoccuparci di includere le nostre classi PHP nei file del nostro progetto, e questo è utile sopratutto quando abbiamo a che fare con molte classi.
Il nostro progetto è localizzato della directory "/var/www/html/test", ed è stutturato con una "index.php" ed una alberatura di directory e files
index.php
Lib
Admin
Ruoli.php
User
Info.php
Nella cartella "Lib" abbiamo una sottodirectory "Admin" che contiene un file "Ruoli.php", con una classe "Ruoli" e con un namespace uguale al path in cui si trova cioè "Lib\Admin"
<?php
namespace Lib\Admin;
class Ruoli{
public function __construct()
{
echo "ciao dalla classe ".__CLASS__;
}
}
?>
Sempre nella cartella "Lib" abbiamo una sottodirectory "User" che contiene un file "Info.php", con una classe "Info" e con un namespace uguale al path in cui si trova cioè "Lib\User"
<?php
namespace Lib\User;
class Info{
public function __construct()
{
echo "ciao dalla classe ".__CLASS__;
}
}
?>
Entrambe le classi hanno un metodo costruttore che, come ben sappiamo, viene automaticamente chiamato quando viene istanziato un oggetto della classe.
Nella "index.php", in cui voglio utilizzare le due classi, dovrò includere i file che contengono le classi e poi istanziare gli oggetti, utizzando un QUALIFIED NAME cioè indicando il namespace delle classi:
<?php
include "Lib/Admin/Ruoli.php";
include "Lib/User/Info.php";
$obj=new Lib\Admin\Ruoli();
echo "<br>";
$obj=new Lib\User\Info();
?>
Se avessimo molte classi, utilizzare questa metodologia di lavoro questo diventerebbe molto faticosa.
Vediamo come fare la stessa cosa usando Composer utilizzando il suo autoload.
Affinchè Composer possa generare il file di autoload, abbiamo bisogno di un file composer.json come, ad esempio, questo:
{
"name": "class-tutorial",
"description": "Ecco un tutorial con Composer",
"license": "MIT",
"authors": [
{
"name": "Mario",
"email": "mario@gmail.com"
}
],
"autoload": {
"classmap": [
"Lib/Admin",
"Lib/User"
]
}
}
Questo file è in formato JSON, all'interno del quale ci sono delle informazioni, tra cui la chiave "classmap", un oggetto che contiene la lista dei path specifici delle nostre classi.
Carichiamo questo file nella root del progetto, cioè /var/www/html/test (dove è localizzata anche la "index.php"), e, usando un terminale, andiamo a posizionarci in questa cartella
cd /var/www/html/test
Adesso lanciamo il seguente comando:
composer update
verrà così generata una cartella "vendor" all'interno della root del nostro progetto, all'interno di questa cartella c'è il file "autoload.php" che ci servirà per caricare automaticamente le classi.
Nel file "index.php" includiamo questo questo file generato da composer, e senza includere più i due file "Lib/Admin/Ruoli.php" e "Lib/User/Info.php", instanziamo un oggetto delle classi Ruoli e Info
<?php
require_once __DIR__.'/vendor/autoload.php';
$obj=new Lib\Admin\Ruoli();
echo "<br>";
$obj=new Lib\User\Info();
?>
Ogni volta che si modifica il file composer.json, ad esempio se si aggiungono nuove classi, bisogna lanciare il comando "dump-autoload" per aggiornare l’autoloader di composer
composer dump-autoload
Ultima nota: in questo esempio abbiammo creato l'alberatura, i nomi dei file e delle classi, utilizzando uno standard di programmazione PHP chiamato psr-4, ed utilizzato specificatamente per la generazione di autoloading dei file. Ce ne occuperemo dettagliatamente in un prossimo articolo.
Stay tuned!