CONTATTACI

Guide per aspiranti programmatori

Lezione 5 / 30

Gestore di dipendenze Composer

Che cos’è Composer

Composer è un gestore di dipendenze per il linguaggio PHP, ovvero un tool che permette di dichiarare da quali librerie dipende il proprio progetto e offre comandi per installare e aggiornare tali dipendenze.

Nel mondo dello sviluppo software, infatti, è normale utilizzare delle librerie esterne (o di terze parti) che implementano le varie funzionalità al contorno utili al proprio progetto. Non vogliamo inventare la ruota ogni volta da capo, vogliamo essere focalizzati sulle esigenze core del nostro progetto. Per questo, ad esempio, possiamo decidere di aggiungere al nostro progetto come dipendenza una determina libreria che ci permette di verificare se un indirizzo email è valido ed esistente, per poi usarla nel flusso di registrazione utente del sito che stiamo sviluppando con Laravel.

Da questo punto vista Laravel stesso è una libreria esterna (una serie di singole librerie, in verità), inclusa tra le dipendenze del nostro progetto tramite Composer.

Per completezza, anticipiamo subito che Composer si occupa non solo di definire e recuperare le varie dipendenze di progetto, ma anche dell’autoloading delle classi PHP, come illustreremo più avanti.

Come installare Composer

Per l’installazione di Composer è richiesto che sul proprio computer sia presente PHP 7.2.5 o più recente.

Le esatte istruzioni per l’installazione differiscono a seconda che si stia usando un sistema operativo UNIX-Like (linux o macOS) oppure Windows.

Istruzioni esatte possono essere consultate presso il sito di Composer

Setup di un progetto

Un progetto che utilizza Composer è caratterizzato dalla presenza di un file composer.json nella sua directory principale.

Tale file contiene le dipendenze del progetto e contiene altre informazioni aggiuntive.

Un esempio minimale di file di configurazione è il seguente:

{
  "require": {
    "monolog/monolog": "^3.0.0"
  }
}

Tale file ci dice che l’unica dipendenza del progetto (la sezione require) è Monolog (una libreria PHP per il logging).

Ogni dipendenza è composta da:

  • il nome del pacchetto (package name): monolog/monolog, composto a sua volta dal nome del vendor e il nome della pacchetto, separati da /
  • un selettore di versione (version contraint): ^3.0.0 è una indicazione di compatibilità desiderata tra le versioni che verranno trovate

Nel momento in cui daremo il comando composer install, la configurazione sarà usata per cercare online nel registro dei pacchetti un pacchetto compatibile con le indicazioni fornite.

$ composer install     
No composer.lock file present. Updating dependencies to latest instead of installing from lock file. See https://getcomposer.org/install for more information.
Loading composer repositories with package information
Updating dependencies
Lock file operations: 2 installs, 0 updates, 0 removals
 - Locking monolog/monolog (3.2.0)
 - Locking psr/log (3.0.0)
Writing lock file
Installing dependencies from lock file (including require-dev)
Package operations: 2 installs, 0 updates, 0 removals
 - Downloading psr/log (3.0.0)
 - Downloading monolog/monolog (3.2.0)
 - Installing psr/log (3.0.0): Extracting archive
 - Installing monolog/monolog (3.2.0): Extracting archive
10 package suggestions were added by new dependencies, use `composer suggest` to see details.
Generating autoload files

Durante la sua esecuzione Composer ha:

  • trovato che è necessario un altro pacchetto, psr/log per installare Monolog
  • scelto l’ultima versione disponibile di Monolog, la 3.2.0, poiché “compatibile” con il selettore indicato (^3.0.0 vuol dire in pratica “ogni versione maggiore di 3.0.0, ma non la 4.0.0 e successive”)
  • aggiunto il file composer.lock, un file speciale che serve per “bloccare” l’esatta versione delle dipendenze recuperate
  • creata la directory vendor in cui sono stati estratti i file PHP che compongono le due librerie recuperate
  • creato nella directory vendor il file autoload.php che possiamo usare nei nostri file PHP per gestire l’autoload delle classi

Sarà, quindi, possibile aggiungere al nostro mini progetto una directory src all’interno della quale creare un file log_me.php con il seguente contenuto:

<?php

// Autoload files using the Composer autoloader.
require_once __DIR__ . '/../vendor/autoload.php';

use Monolog\Level;
use Monolog\Logger;
use Monolog\Handler\StreamHandler;

// create a log channel
$log = new Logger('name');
$log->pushHandler(new StreamHandler('path/to/your.log', Level::Warning));

// add records to the log
$log->warning('Foo');
$log->error('Bar');

Potremo, quindi, eseguire lo script PHP digitando nel terminale

php src/log_me.php

Gestione delle dipendenze

Composer mette a disposizione diversi comandi per gestire l’aggiunta e l’aggiornamento delle dipendenze, in particolare:

  • composer update – recupera la versione più recente compatibile con il selettore di versione indicato di tutte le dipendenze
  • composer update vendor1/package1 vendor2/package2 … – come sopra, ma soltanto per i pacchetti indicati
  • composer require vendor/package – aggiunge un pacchetto alle dipedenze
  • composer show vendor/package – mostra informazioni sul pacchetto
  • composer require vendor/package –dev – aggiunge un pacchetto alle dipendenze di tipo “dev”

Maggiori informazioni su quali comandi sono disponibili e sulle varie opzioni possono essere recuperate eseguendo composer list e composer help.

I vari pacchetti Composer sono distribuiti tramite il servizio Packagist. È possibile cercare pacchetti e consultare i relativi dettagli sia tramite il sito web – https://packagist.org/ – che tramite il comando composer search.

Creazione di progetti da template

Con Composer è anche possibile creare un nuovo progetto basandosi su un template esistente. In pratica, invece di creare un progetto vuoto e andare, man mano, ad aggiungere le singole dipendenze, è possibile istruire composer per creare un nuovo progetto basandosi su un template che contiene già tutte le dipendenze necessarie.

Un template di progetto è realizzato e distribuito a sua volta come un pacchetto: il suo nome è, quindi, nella forma vendor/project e possono esisterne versioni diverse. Nel caso in cui non venga indicata una versione, Composer recupera l’ultimo template disponibile. Nel template ci sono i pacchetti (e la relativa versione) scelti da chi ha realizzato il template più, eventualmente, tutti i file necessari ad avere un progetto funzionante da subito.

Per creare un nuovo progetto usando un template possiamo usare il comando create-project, indicato il pacchetto template da usare e il nome del progetto che vogliamo creare:

composer create-project vendor/project:version nome-progetto

Verrà creata una directory nome-progetto all’interno del quale troveremo il file composer.json, la directory vendor ed eventualmente directory e file creati dagli script di inizializzazione del template.

Come vedremo nella prossima lezione, è possibile creare un nuovo progetto che usa Laravel con questo comando.

Dipendenze di sviluppo

Composer permette di distinguere tra due gruppi di dipendenze, le require e le require-dev:

{
  "require": {
    "monolog/monolog": "^3.0.0"
  },
  "require-dev": {
    "phpunit/phpunit": "^9.5"
  }
}

Nel primo gruppo vanno inserite quelle dipendenze che servono a far funzionare la nostra applicazione, nel secondo tutte le dipendenze che non servono al codice “di produzione”, ma sono di supporto durante le fasi di sviluppo.

Nell’esempio precedente è stata inclusa la libreria per l’esecuzione di test PhpUnit tra le dipendenze di sviluppo.

Dipendenze di piattaforma

Nell’elenco dei require è anche possibile indicare alcune dipendenze “di sistema”. Composer, infatti, definisce al suo interno alcuni “platform package”, pacchetti virtuali che non possono essere installati da Composer, ma che sono o devono essere installati sul sistema. Tale elenco include:

  • php stesso, per il quale è possibile indicare la versione richiesta o necessaria al nostro progetto
  • le estensioni di PHP, nel formato ext-<name>
  • alcune librerie di sistema, nel formato lib-<name>

Anche se con alcune limitazioni, definire questi platform package permette di scoprire se stiamo installando l’applicativo PHP su una macchina che ha tutto quello che serve alla sua esecuzione.

Autoloading

Una delle funzionalità più importanti di Composer è, però, quella di gestire l’autoloading delle classi PHP.

Proviamo a eseguire i seguenti comandi da terminale e, nel momento in cui viene chiesto come configurare, a premere invio sulle righe dove non è stata data una risposta nel seguente esempio:

$ mkdir composer-demo
$ cd composer-demo
$ composer init --name=acme/composer-demo --type=project

This command will guide you through creating your composer.json config.

Package name (<vendor>/<name>) [acme/composer-demo]:
Description []:
Author [n to skip]: n
Minimum Stability []:
Package Type (e.g. library, project, metapackage, composer-plugin) [project]:
License []:

Define your dependencies.

Would you like to define your dependencies (require) interactively [yes]? no
Would you like to define your dev dependencies (require-dev) interactively [yes]? no
Add PSR-4 autoload mapping? Maps namespace "Acme\ComposerDemo" to the entered relative path. [src/, n to skip]:
{
  "name": "acme/composer-demo",
  "type": "project",
  "autoload": {
    "psr-4": {
      "Acme\\ComposerDemo\\": "src/"
    }
  },
  "require": {}
}

Do you confirm generation [yes]? yes
Generating autoload files
Generated autoload files
PSR-4 autoloading configured. Use "namespace Acme\ComposerDemo;" in src/
Include the Composer autoloader with: require 'vendor/autoload.php';

Creiamo, quindi, i file src/Greetings.php e src/run.php con il seguente contenuto:

// src/Greetings.php
<?php

namespace Acme\ComposerDemo;

class Greetings
{
  public static function sayHelloWorld() {
    return 'Hello World';
  }
}

// src/run.php
<?php

// Autoload files using the Composer autoloader.
require_once __DIR__ . '/../vendor/autoload.php';

use Acme\ComposerDemo\Greetings;

echo Greetings::sayHelloWorld();

Se da terminale eseguiamo il nostro script otterremo:

$ php src/run.php
Hello World

La configurazione della sezione autoload del file composer.json regola il contenuto del file vendor/autoload.php. In particolare, nella nostra configurazione d’esempio, abbiamo istruito l’autoload per recuperare le classi del namespace Acme\ComposerDemo nella directory src.

Se volessimo cambiare directory o cambiare nome del namespace, dovremmo aggiornare i file PHP e il contenuto del file composer.json e poi eseguire il comando composer dump-autoload per aggiornare il contenuto del file vendor/autoload.php.

Vedremo, più avanti, come progetti utilizzino Laravel sfruttando questa funzione per gestire l’albero delle directory del progetto in modo coerente e prevedibile

Contattaci senza impegno per informazioni sul corso

Pagamento rateale

Valore della rata: A PARTIRE DA 115 €/mese.

Esempio di finanziamento 

Importo finanziato: € 2440 in 24 rate da € 115 – TAN fisso 9,55% TAEG 12,57% – importo totale del credito € 2841.

Il costo totale del credito comprende: interessi calcolati al TAN indicato, oneri fiscali (imposta di bollo sul contratto 16,00 euro*) addebitati sulla prima rata, costo mensile di gestione pratica € 3,90, spesa di istruttoria € 0,00, spesa per invio rendicontazione periodica cartacea € 0,98 (o spesa per invio rendicontazione periodica cartacea € 0,00), imposta di bollo su rendicontazione periodica € 0,00. Modalità di rimborso obbligatoria: addebito diretto su c/c. La scadenza delle rate è determinata dal giorno della liquidazione del contratto; la data di scadenza delle rate è prevista il giorno 15 del mese. L’importo di ciascuna rata comprende una quota di capitale crescente e interessi decrescente secondo un piano di ammortamento “alla francese”. Offerta valida dal 01/01/2024 al 31/12/2024.

Messaggio pubblicitario con finalità promozionale. Per le informazioni precontrattuali richiedere sul punto vendita il documento “Informazioni europee di base sul credito ai consumatori” (SECCI) e copia del testo contrattuale. Salvo approvazione di Sella Personal Credit S.p.A. Aulab S.r.l. opera quale intermediario del credito NON in esclusiva.

*In fase di richiesta del finanziamento verrà proposta la facoltà di selezionare, in alternativa all’imposta di bollo sul contratto di 16,00 euro, l’imposta sostitutiva, pari allo 0,25% dell’importo finanziato.

Pagamento rateale

Valore della rata: A PARTIRE DA 187 €/mese.

Esempio di finanziamento  

Importo finanziato: € 3990 in 24 rate da € 187 – TAN fisso 9,55% TAEG 12,57% – importo totale del credito € 4572.88.

Il costo totale del credito comprende: interessi calcolati al TAN indicato, oneri fiscali (imposta di bollo sul contratto 16,00 euro*) addebitati sulla prima rata, costo mensile di gestione pratica € 3,90, spesa di istruttoria € 0,00, spesa per invio rendicontazione periodica cartacea € 0,98 (o spesa per invio rendicontazione periodica cartacea € 0,00), imposta di bollo su rendicontazione periodica € 0,00. Modalità di rimborso obbligatoria: addebito diretto su c/c. La scadenza delle rate è determinata dal giorno della liquidazione del contratto; la data di scadenza delle rate è prevista il giorno 15 del mese. L’importo di ciascuna rata comprende una quota di capitale crescente e interessi decrescente secondo un piano di ammortamento “alla francese”. Offerta valida dal 01/01/2024 al 31/12/2024.

Messaggio pubblicitario con finalità promozionale. Per le informazioni precontrattuali richiedere sul punto vendita il documento “Informazioni europee di base sul credito ai consumatori” (SECCI) e copia del testo contrattuale. Salvo approvazione di Sella Personal Credit S.p.A. Aulab S.r.l. opera quale intermediario del credito NON in esclusiva.

* In fase di richiesta del finanziamento verrà proposta la facoltà di selezionare, in alternativa all’imposta di bollo sul contratto di 16,00 euro, l’imposta sostitutiva, pari allo 0,25% dell’importo finanziato.

Contattaci senza impegno per informazioni sul corso

Scopriamo insieme se i nostri corsi fanno per te. Compila il form e aspetta la chiamata di uno dei nostri consulenti.