Gli Hook

25 gennaio 2017

Composer permette di aggiungere alcune azioni da eseguire durante le fasi del ciclo di esecuzione di un progetto come ad esempio la creazione o l’aggiornamento. Grazie a questa caratteristica è possibile avviare automaticamente dei comandi nel momento dell’installazione di un nuovo pacchetto o durante l’update del progetto.

Gli utilizzi sono potenzialmente illimitati, ad esempio è possibile inviare email di notifica durante l’aggiornamento dei pacchetti composer, ripulire la cache ad ogni aggiornamento dell’autoloader o copiare un file di configurazione di distribuzione nella sua versione locale. In questo modo è possibile gestire una sorta di deployment con un alto livello di granularità. Tanto è vero che un framework diffuso come Symfony utilizza questo sistema per avviare comandi all’installazione e all’aggiornamento dell’applicazione.

Configurare gli script

Gli script che vogliamo eseguire devono essere inseriti nel file di configurazione aggiungendo la sezione scripts che conterrà una voce per ogni evento trigger dei comandi. È consentito impostare uno o più script per uno stesso evento e uno stesso comando può essere avviato da più di un trigger.

Per Composer uno script di hook può essere indifferentemente:

  • una callback in PHP (una funzione o un metodo statico di una classe);
  • un eseguibile di sistema da richiamare (o anche uno script da far eseguire all’interprete).

Nel caso di uno script da passare all’interprete PHP è possibile usare l’operatore @php per utilizzare lo stesso interprete con il quale viene eseguito Composer.

Nel caso della callback deve essere indicato il namespace completo della classe e il nome del metodo statico separati dall’operatore ::, nel caso dell’eseguibile di sistema la path necessaria ad avviare lo stesso e i parametri necessari in un unica stringa. In entrambi i casi è necessario prestare attenzione ai caratteri non permessi dalle stringhe JSON per l’escape mirato, ad esempio sui caratteri virgolette (") o backslash (\).

Inoltre è possibile invocare comandi Composer (ad esempio composer install) tramite l’operatore dedicato @composer. Infine per evitare di ricopiare i comandi ripetuti è possibile riferirsi ad un comando da eseguire facendone precedere il nome da @.

Questa potrebbe essere la sezione scripts di un file composer.json valido:

{
    // Altre sezioni
    // [...]

    "scripts": {
        "nome-evento-1": "MyClass::postEvento1",
        "nome-evento-2": "/usr/bin/php script.php",
        "nome-evento-3": [
            "MyClass::postEvento3",
            "@php script.php"
        ]
        "nome-evento-4": [
            "@composer install",
            "@nome-evento-1"
        ]
    }
}

Da notare che gli eventi utilizzabili non sono esclusivamente quelli predefiniti che vengono chiamati automaticamente dall’eseguibile perché è possibile aggiungere eventi personalizzati. Questi possono essere referenziati da altri per ridurre le ripetizioni o invocati direttamente tramite riga di comando:

composer run-script nome-evento-1

Gli eventi predefiniti

Composer presenta un alto numero di eventi predefiniti divisi in 4 categorie:

Categoria eventiDescrizione
Eventi dell’installerQueste due categorie contengono gli eventi che si svolgono in relazione ad operazioni eseguite internamente dall’eseguibile di Composer come la risoluzione di dipendenze o il download dei pacchetti. Si tratta di eventi che permettono di modificare il comportamento dell’installer, ma che difficilmente saranno utilizzati.
Eventi dei plugin
Eventi dei packageVengono eseguiti in relazione all’installazione, rimozione o aggiornamento dei pacchetti. Il nome del pacchetto viene passato allo script da eseguire e quindi è possibile eseguirli solo durante gli eventi legati a uno specifico pacchetto. Anche in questo caso è raro che sia necessario inserire un hook del genere.
Eventi dei comandiSono i più utilizzati e possono essere avviati durante i comandi di Composer come ad esempio autoload-dump, install, update e status. Per ognuno dei comandi può esistere un evento pre, generato prima che il comando sia chiamato, e un evento post, generato dopo la chiamata del comando.

Nello specifico gli eventi relativi ai comandi elencati sono:

EventoEsecuzione
pre-install-cmdPrima del comando composer install.
post-install-cmdDopo il comando composer install.
pre-update-cmdPrima di composer update.
post-update-cmdDopo composer update.
pre-autoload-dumpPrima di composer autoload-dump.
post-autoload-dumpDopo composer autoload-dump.
post-status-cmdDopo composer install.

Ad ognuno dei callback impostati per uno di questi eventi viene passata un’istanza della class Composer\Script\Event che permette ad esempio di ottenere parametri o flags utilizzati con il comando invocato da Composer. Anche in questo caso raramente sarà necessario ricorrere ai metodi di tale oggetto, ma la sua presenza garantisce flessibilità.

Intercettare eventi per ambienti dev

Composer divide i pacchetti da installare in ambiente di produzione da quelli per la fase di sviluppo (ad esempio ambienti di testing). Prima di invocare gli script di hook Composer imposta automaticamente la variabile di sistema COMPOSER_DEV_MODE che può essere letta sia da eseguibili che da callback PHP tramite funzione getenv.

La variabile ha il valore 1 di default perché vengono installate anche le componenti necessarie allo sviluppo, ma assume il valore 0 quando Composer viene invocato aggiungendo il parametro --no-dev da linea di comando. Grazie a questa funzionalità è possibile ad esempio impostare un flag conosciuto dalla nostra applicazione per avviarla in modalità debug o importare script necessari solo nell’ambiente di produzione, come un tracker per l’accesso dei visitatori o un banner pubblicitario.

Tutte le lezioni

1 ... 6 7 8 ... 10

Se vuoi aggiornamenti su Gli Hook inserisci la tua e-mail nel box qui sotto:
 
X
Se vuoi aggiornamenti su Gli Hook

inserisci la tua e-mail nel box qui sotto:

Ho letto e acconsento l'informativa sulla privacy

Acconsento al trattamento dei dati per attività di marketing