composer

Composer Autoload

Nel precedente articolo abbiamo mostrato l’integrazione tra composer e packagist nel nostro progetto web.
In particolare, abbiamo visto come aggiungere librerie al progetto, gestire le dipendenze ed utilizzare il composer autoloader  per includerle nei nostri script.
Abbiamo anche visto come composer per gestire i pacchetti desiderati si avvale del file composer.json.
In questo articolo mostreremo come si possa utilizzare Composer per fare l’autoload delle nostre classi o di altre non gestite direttamente da Composer.
Questo ci permetterà di includere negli script del progetto le nostre classi senza la necessità di usare i soliti comandi include/require di php.

Per includere classi non Composer ci sono due modalità utilizzabili:

  • Composer autoloading
  • PSR-4 standard autoloading

Composer autoloading

La maniera più semplice per realizzare questa modalità è quella di caricare ciascuna classe separatamente.
Per farlo è sufficiente definire, in composer.json, un array con il percorso completo di ciascuna classe che vogliamo caricare.

    {
        "autoload": {
        "classmap": [
                      "percorso/classe1.php",
                       "percorso/classe2.php",
                      "percorso/classe3.php",
                    ]
                    }
    }

Dopo aver inserito queste righe nel file composer.json, occorre aggiornare l’autoload mediante il comando seguente:

composer dump-autoload -o

Infine, come già visto nel precedente articolo occorre includere l’autoloader nei nostri script mediante:

      <?php
                require "vendor/autoload.php";

Se volessimo fare l’autoload di intere directory di classi, potremmo utilizzare una struttura simile alla seguente:

       {
           "autoload": {
           "classmap": [
                         "percorso/classe1.php",
                         "percorso/directory"
                       ]
                      }
       }

PSR-4 standard autoloading

PSR-4 costituisce un nuovo standard per gestire l’autoloading e fa uso dei namespace, tecnica che evita i conflitti tra classi con lo stesso nome, ma appartenenti a librerie diverse.

Per poter gestire le nostre classi mediante PSR-4, immaginiamo lo scenario seguente:

     cartella-sito /
           sotto-cartella-mie-classi/
               classe1.php
               classe2.php
               classe3.php

Assegniamo alle classi un namespace, uguale per tutte:

     <?php
        namespace MiaAzienda;

       class Classe1 {
                       public function __construct()
                       {
                            echo "Ciao, sono classe1.";
                       }
                    }

Riportiamo le informazioni nel file composer.json così:

    {
            "autoload": {
                           "psr-4": {
                                      "MiaAzienda\\":"sotto-cartella-mie-classi/"
                                    }
                        }
    }

Il namespace deve terminare con i due caratteri \\

Aggiorniamo il Composer autoloader:

composer dump-autoload -o

Infine importiamo l’autoloader e i namespace nei nostri script così:

       <?php
            require "vendor/autoload.php";

                use MiaAzienda\Classe1;
                use MiaAzienda\Classe2;
                use MiaAzienda\Classe1;

                $obj1 = new Classe1();
                $obj2 = new Classe2();
                $obj3 = new Classe3();

Un altro modo per creare le istanze delle classi, equivalente al precedente, consiste nel far precedere il nome della classe dal namespace:

       
       <?php
            require "vendor/autoload.php";

            $obj1 = new MiaAzienda\Classe1();
            $obj2 = new MiaAzienda\Classe2();
            $obj3 = new MiaAzienda\Classe3();

Se la struttura delle directory si presenta più articolata, basta aggiungere nel namespace le cartelle figlie della cartella contenente le classi.

Supponiamo di avere la seguente struttura:

              cartella-sito /
                  sotto-cartella-mie-classi/
                    classe1.php
                    classe2.php
                    sotto-sotto-cartella-mie-classi \
                         classe3.php

Cambiare poi così il file delle classi e l’inclusione negli script:

       <?php
           namespace MiaAzienda\sotto-sotto-cartella-mie-classi;

           public class Classe3 {
                   function __construct()
                   {
                       echo "Ciao, sono classe 3.";
                   }
             }
      <?php
           require "vendor/autoload.php";
           use MiaAzienda\Classe1;
           use MiaAzienda\Classe1;
           use MiaAzienda\sotto-sotto-cartella-mie-classi\Classe3;

           $obj1 = new Classe1();
           $obj2 = new Classe2();
           $obj3 = new Classe3();

Articoli correlati

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *