app/Console/Commands
, ma è possibile posizionarli ovunque per poi richiamarli tramite composer.Creare e registrare un Comando
Per questo ci basta scrivere in console
make:console NomeClasse
per creare un comando.NomeClasse
sarà anche il comando che potremo successivamente lanciare dalla console.In alternativa, è possibile tramite il parametro
--command
, assegnare un nome diverso dal nome della classe generata, come nell’esempio di seguito.php artisan make:command QuizStart --command=quiz:start
QuizStart in /app/console/commands
/app/console/Kernel.php
, se così non fosse bisognerà aggiungerlo in questo modo:protected $commands = [
'App\Console\Commands\QuizStart'
];
php artisan list
php artisan quiz:start
Struttura di un file Command
<?php
#/App/Console/Commands/QuizStart.php
namespace App\Console\Commands;
use Illuminate\Console\Command;
class QuizStart extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'quiz:start';
/**
* 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()
{
//
}
}
Stampare Messaggi
Per stampare messaggi in console esistono diversi comandi, a seconda di come si vuole formattare il messaggio.
Per testare i vari stili dei messaggi è possibile copiare e incollare l’esempio:
/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
$this->line(“Semplice testo");
$this->info("Hey, questo è un avviso guarda !");
$this->comment(“Questo è un commento");
$this->question(“Davvero hai qualcosa da chiedermi?");
$this->error("Ops, qualcosa è andato storto.");
}
Input: arguments e options
Utilizzare Argomenti e opzioni
Nella property signature è possibile, insieme al nome del comando, definire anche gli arguments e le options di cui abbiamo bisogno per far lavorare il nostro script.
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'quiz:start {user} {age} {--difficulty=} {--istest=}’;
Gli argument verranno registrati tramite la sintassi {nomeArgomento}
,
mentre le option {- -nomeOpzione=}
.
Non è necessario creare i metodi get per recuperare le options, più avanti vedremo come fare.
La sintassi è molto semplice, questi sono i modi per poter utilizzare gli arguments e le options nei nostri comandi:
- Argomento: quiz:start {argument}.
- Argomento opzionale (da notare il punto interrogativo alla fine del nome dell’argument): quiz:start {argument?}.
- Argomento con un valore di default: quiz:start {argument=defaultValue}.
- Opzione Booleana: quiz:start –myOption.
- Opzione con un valore: quiz:start –myOption=.
- Opzione con un valore di default: quiz:start –myOption=12.
Recuperare i valori da argomenti e opzioni
/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
// Get single Parameters
$username = $this->argument('user');
$difficulty = $this->option('difficulty');
// Get all
$arguments = $this->arguments();
$options = $this->options();
// Stop execution and ask a question
$answer = $this->ask('What is your name?');
// Ask for sensitive information
$password = $this->secret('What is the password?');
// Choices
$name = $this->choice('What is your name?', ['Taylor', 'Dayle'], $default);
// Confirmation
if ($this->confirm('Is '.$name.' correct, do you wish to continue? [y|N]')) {
//
}
}
Esempio
Nell’esempio che segue, mostro un quiz interattivo, dove bisognerà rispondere a tutte le domande e alla fine verranno mostrate in console, tutte le risposte date.
/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
$difficulty = $this->option('difficulty');
if(!$difficulty){
$difficulty = 'easy';
}
$this->line('Welcome '.$this->argument('user').", starting test in difficulty : ". $difficulty);
$questions = [
'easy' => [
'How old are you ?', "What is the name of your mother?",
'Do you have 3 parents ?','Do you like Javascript?',
'Do you know what is a JS promise?'
],
'hard' => [
'Why the sky is blue?', "Can a kangaroo jump higher than a house?",
'Do you think i am a bad father?','why the dinosaurs disappeared?',
"why don't whales have gills?"
]
];
$questionsToAsk = $questions[$difficulty];
$answers = [];
foreach($questionsToAsk as $question){
$answer = $this->ask($question);
array_push($answers,$answer);
}
$this->info("Thanks for do the quiz in the console, your answers : ");
for($i = 0;$i <= (count($questionsToAsk) -1 );$i++){
$this->line(($i + 1).') '. $answers[$i]);
}
}
Eseguire un comando da un controller o una route
$exitCode = Artisan::call('quiz:start', [
'user' => 'Carlos', '--difficulty' => 'hard'
]);
Inserire una barra di avanzamento
$bar = $this->output->createProgressBar(count($users));
foreach ($users as $user) {
$this->performTask($user);
$bar->advance();
}
$bar->finish();