Artisan è un applicativo utilizzabile dalla riga di comando incluso nel pacchetto Laravel. Artisan mette a disposizione molti comandi utili per aiutarti durante lo sviluppo della tua applicazione. Per mostrare l’elenco dei comandi disponibili è sufficiente digitare

php artisan list

dalla riga di comando nella cartella della tua applicazione Laravel.

Ma come si crea un comando personalizzato con Artisan?

E’ più semplice di quanto si possa pensare. Prendiamo ad esempio il caso in cui vogliamo creare un comando per inserire un po’ di utenti all’interno del database. Sul terminale digitiamo:

php artisan make:command CreateUsers

CreateUsers è il nome della classe che Artisan crea nella cartella app/Console/Commands. La classe creata sarà simile a quanto mostrato di seguito:

<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;

class CreateUsers extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'command:name';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Command description';

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
        //
    }
}

Iniziamo la personalizzazione. Il primo attributo, $signature, corrisponde al nome del comando che dovrà essere digitato sul terminale per richiamare l’esecuzione del nostro script. In questo caso potrà essere una cosa del genere:

protected $signature = 'create:users';

L’attributo $decription invece conterrà la descrizione del comando che viene mostrata nell’elenco dei comandi artisan che abbiamo visto sopra.

Prima di procedere, registriamo il nostro comando in modo che venga riconosciuto da Artisan. Apriamo il file app/Console/Kernel.php. Il primo attributo è l’array $commands che dovremo modificare come mostrato di seguito:

    /**
     * The Artisan commands provided by your application.
     *
     * @var array
     */
    protected $commands = [
        Commands\CreateUsers::class
    ];

Torniamo adesso alla classe CreateUsers e aggiungiamo qualcosa al metodo handle() per verificare che il nostro comando venga eseguito correttamente. Il metodo handle() contiene la logica che viene eseguita quando il comando viene lanciato.

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
        $this->info('Creating users ...');
    }

Il metodo info() è ereditato dalla classe Command che la nostra classe estende e mostrerà sul terminale il testo che abbiamo inserito come argomento.

Se eseguiamo il comando dal terminale adesso vedremo mostrato il testo in questione. Ma andiamo oltre, creiamo un array con qualche utente fittizio e inseriamolo nel database.

    public function handle()
    {
        $this->info('Creating users ...');

        $users = [
            ['email' => 'john.doe@email.com', 'name' => 'John Doe'],
            ['email' => 'mark.smith@email.com', 'name' => 'Mark Smith'],
        ];
        
        foreach ($users as $user) {
            $this->info("\nCreating user" . $user['name']);
            \App\User::create($user);
        }
        $this->info("\nOperation completed!");
    }

Per ogni utente mostriamo a video il messaggio di conferma di creazione con il nome dell’utente e un messaggio finale di operazione completata. Potremmo migliorare questo comando rendendolo più vicino a un utilizzo reale magari caricando gli utenti da un file csv.

Ma miglioriamolo ancora, mostrando una barra di caricamento, molto utile nel caso in cui il numero di record da caricare sia elevato e/o sconosciuto a priori.

public function handle()
    {
        $this->info('Creating users ...');

        $users = [
            ['email' => 'john.doe@email.com', 'name' => 'John Doe'],
            ['email' => 'mark.smith@email.com', 'name' => 'Mark Smith'],
        ];

        $progressBar = $this->output->createProgressBar(count($users));

        foreach ($users as $user) {
            $this->info("\nCreating user" . $user['name']);
            \App\User::create($user);
            $progressBar->advance();
        }
        
        $progressBar->finish();
        $this->info("\nOperation completed!");
    }

Semplice, no? Il metodo createProgressBar() genera un’istanza della classe che gestisce la visualizzazione della barra di caricamento. Il metodo advance() incrementa l’avanzamento della barra e una volta completato il metodo finish() mostra la barra completa.

Esistono molte altre funzionaltà interessanti per le quali vi rimandiamo alla documentazione ufficiale per la creazione di un comando personalizzato Artisan.

Dai un’occhiata ai nostri corsi in aula Laravel:  BASE, FULL e ADVANCED! Immergiti nel mondo Laravel con LaraMind!