Artisan-Befehlszeile
Artisan Befehlszeile
- Einführung
- Befehl schreiben
- Eingabeerwartungen definieren
- E/A Befehl
- Befehl registrieren
- Befehle programmgesteuert ausführen
Einführung
Handwerklich Es handelt sich um die Befehlszeilenschnittstelle, die mit Laravel geliefert wird. Sie bietet viele Befehle, die Ihnen beim Erstellen von Laravel-Anwendungen helfen. Um eine Liste aller verfügbaren Artisan-Befehle anzuzeigen, verwenden Sie den Befehl list
:
php artisan list
Jeder Befehl enthält eine Hilfeschnittstelle, die die verfügbaren Argumente und Optionen für den Befehl anzeigt und zusammenfasst. Fügen Sie einfach help
vor dem Befehl hinzu, um die Befehlshilfeschnittstelle anzuzeigen:
php artisan help migrate
Tinker Command (REPL)
Alle Laravel-Anwendungen umfassen Tinker, a Das PsySH-Paket bietet Unterstützung für die REPL. Mit Tinker können Sie über die Befehlszeile mit Ihrer gesamten Laravel-Anwendung interagieren. Beinhaltet Eloquent ORM, Aufgaben, Ereignisse und mehr. Führen Sie den Artisan-Befehl tinker
aus, um die Tinker-Umgebung aufzurufen:
php artisan tinker
Sie können die Tinker-Konfigurationsdatei veröffentlichen, indem Sie den Befehl vendor:publish
verwenden:
php artisan vendor:publish --provider="Laravel\Tinker\TinkerServiceProvider"
Befehls-Whitelist
Tinker verwendet eine Whitelist, um zu bestimmen, welche Artisan-Befehle in der Shell ausgeführt werden dürfen. Standardmäßig können Sie die Befehle clear-compiled
, down
, env
, inspire
, migrate
, optimize
und up
ausführen. Wenn Sie weitere Whitelist-Befehle hinzufügen möchten, können Sie diese zum Array tinker.php
in der Konfigurationsdatei commands
hinzufügen:
'commands' => [ // App\Console\Commands\ExampleCommand::class, ],
Blacklist-Alias
Typischerweise Tinker fügt den Klassen in Tinker automatisch Aliase hinzu, je nach Ihren Anforderungen. Allerdings möchten Sie möglicherweise einigen Klassen keine Aliase hinzufügen. Sie können dies tun, indem Sie diese Klassen im Array tinker.php
in der Konfigurationsdatei dont_alias
auflisten:
'dont_alias' => [ App\User::class, ],
Schreiben Sie den Befehl
Zusätzlich zu den von Artisan bereitgestellten Befehlen können Sie auch Ihre eigenen benutzerdefinierten Befehle erstellen. Befehle werden normalerweise im Verzeichnis app/Console/Commands
gespeichert. Solange Ihre Befehle jedoch von Composer geladen werden können, können Sie Ihren eigenen Speicherort wählen.
Befehl generieren
Um einen neuen Befehl zu erstellen, verwenden Sie den Artisan-Befehl make:command
. Dieser Befehl erstellt eine neue Befehlsklasse im Verzeichnis app/Console/Commands
. Machen Sie sich keine Sorgen, wenn dieses Verzeichnis in Ihrer Anwendung nicht vorhanden ist, da es erstellt wird, wenn Sie den Artisan-Befehl make:command
zum ersten Mal ausführen. Der generierte Befehl enthält die Attribute und Methoden, die standardmäßig in allen Befehlen vorhanden sind:
php artisan make:command SendEmails
Befehlsstruktur
Befehl ausführen Abschließend sollten Sie zunächst die Attribute signature
und description
ausfüllen, damit Sie php artisan list
eingeben können Seien Sie in der Lage, die Verwendung klar zu verstehen. Die Methode handle
wird beim Ausführen des Befehls aufgerufen. In dieser Methode können Sie die Befehlslogik platzieren.
{tip} Für eine bessere Code-Wiederverwendung ist es am besten, Ihren Konsolencode kompakt zu halten und die Fertigstellung auf den Anwendungsdienst zu verschieben. Im folgenden Beispiel fügen wir eine Serviceklasse ein, um die Aufgabe des E-Mail-Versands abzuschließen.
Schauen wir uns ein einfaches Beispiel an. Wir können alle benötigten Abhängigkeiten in die Methode handle
einfügen. Der Laravel-Dienstcontainer fügt automatisch alle Abhängigkeiten mit Typeinschränkungen in den Konstruktor ein:
<?php namespace App\Console\Commands; use App\User;use App\DripEmailer; use Illuminate\Console\Command; class SendEmails extends Command{ /** * The name and signature of the console command. * * @var string */ protected $signature = 'email:send {user}'; /** * The console command description. * * @var string */ protected $description = 'Send drip e-mails to a user'; /** * Create a new command instance. * * @return void */ public function __construct() { parent::__construct(); } /** * Execute the console command. * * @param \App\DripEmailer $drip * @return mixed */ public function handle(DripEmailer $drip) { $drip->send(User::find($this->argument('user'))); } }
Abschlussbefehle
Abschlussbasierte Befehle bieten eine Möglichkeit, Klassen zu verwenden, anstatt Konsolenbefehle zu definieren. Ebenso ist das Closing-Routing eine Alternative zu Controllern, und Closing-Befehle können als Alternative zu Befehlsklassen betrachtet werden. In der app/Console/Kernel.php
-Methode der commands
-Datei lädt Laravel die routes/console.php
-Datei:
/** * Register the Closure based commands for the application. * * @return void */ protected function commands(){ require base_path('routes/console.php'); }
Obwohl diese Datei kein HTTP-Routing definiert, definiert sie den konsolenbasierten Einstiegspunkt (Routing) zu die Anwendungsmitte. In dieser Datei können Sie alle Schließungsrouten mit der Methode Artisan::command
definieren. Die command
-Methode akzeptiert zwei Parameter: Befehlsname und einen Abschluss, der die Befehlsparameter und -optionen akzeptiert:
Artisan::command('build {project}', function ($project) { $this->info("Building {$project}!"); });
Der Abschluss bindet die zugrunde liegende Befehlsinstanz, da Sie Zugriff auf alle fähigen haben Alle Hilfsmethoden in der vollständigen Befehlsklasse.
Typhinweisabhängige Abhängigkeiten
Befehlsabschlüsse können nicht nur Parameter und Optionen für Befehle empfangen, sondern auch Typhinweise aus dem Servicecontainer verwenden Lösen Sie andere Abhängigkeiten auf in:
use App\User; use App\DripEmailer;Artisan::command('email:send {user}', function (DripEmailer $drip, $user) { $drip->send(User::find($user)); });
Beschreibung des Abschlussbefehls
Wenn Sie einen Abschlussbefehl definieren, sollten Sie die Methode describe
verwenden, um dem Befehl eine Beschreibung hinzuzufügen. Diese Beschreibung wird angezeigt, wenn Sie den Befehl php artisan list
oder php artisan help
ausführen:
Artisan::command('build {project}', function ($project) { $this->info("Building {$project}!"); })->describe('Build the project');
Ausgabeerwartungen definieren
Beim Schreiben von Konsolenbefehlen werden Benutzereingaben normalerweise über Parameter und Optionen erfasst. Mit Laravel ist es sehr praktisch, über das Attribut signature
zu definieren, was der Benutzer eingeben soll. signature
Ermöglicht die Definition von Befehlsnamen, Parametern und Optionen mithilfe einer einzigen und gut lesbaren Routing-ähnlichen Syntax.
Parameter
Alle vom Benutzer bereitgestellten Parameter und Optionen sind in geschweifte Klammern eingeschlossen. Im folgenden Beispiel definiert dieser Befehl einen Parameter, der sein muss: user
:
/** * The name and signature of the console command. * * @var string */ protected $signature = 'email:send {user}';
Sie können auch optionale Parameter erstellen und deren Standardwerte definieren:
// 可选参数... email:send {user?} // 带有默认值的可选参数... email:send {user=foo}
Optionen
Optionen sind, ähnlich wie Parameter, ein weiteres Format für Benutzereingaben. Wenn Optionen in der Befehlszeile angegeben werden, werden ihnen zwei Bindestriche ( --
) vorangestellt. Es gibt zwei Arten von Optionen: einen Wert erhalten und keinen Wert erhalten. Eine Option, die keinen Wert akzeptiert, ist wie ein boolescher „Schalter“. Schauen wir uns ein Beispiel für diese Art von Option an:
/** * 命令行的名称及签名。 * * @var string */ protected $signature = 'email:send {user} {--queue}';
In diesem Beispiel kann der Schalter --queue
beim Aufruf des Artisan-Befehls angegeben werden. Der Wert dieser Option ist --queue
, wenn der Schalter true
übergeben wird, false
andernfalls:
php artisan email:send 1 --queue
Optionen mit einem Wert
Als nächstes schauen wir uns eine Option mit einem Wert an. Wenn Sie möchten, dass der Benutzer einen Wert für eine Option angeben muss, müssen Sie ein Gleichheitszeichen =
als Suffix an das Ende des Optionsnamens anhängen:
/** * 命令行的名称及签名。 * * @var string */ protected $signature = 'email:send {user} {--queue=}';
In diesem Beispiel kann der Benutzer dies tun Übergeben Sie den Wert der Option wie folgt. Anzeige:
php artisan email:send 1 --queue=default
Sie können den Standardwert für eine Option auch festlegen, indem Sie den Standardwert nach dem Optionsnamen angeben. Wenn der Benutzer keinen Optionswert übergibt, wird der eingestellte Standardwert verwendet:
email:send {user} {--queue=default}
Die Optionsabkürzung
muss in angegeben werden. Um beim Definieren einer Option eine Abkürzung anzugeben, können Sie diese vor dem Optionsnamen mit < angeben Das Trennzeichen 🎜> trennt die Abkürzung vom vollständigen Optionsnamen: |
email:send {user} {--Q|queue}Eingabearray, wenn Sie möchten Um Parameter oder Optionen zu definieren, die Array-Eingaben empfangen, können Sie das Symbol
verwenden. Schauen wir uns zunächst ein Beispiel für einen Array-Parameter an: *
email:send {user*}Beim Aufruf dieser Methode können die Eingabeparameter des
-Parameters der Reihe nach an die Befehlszeile übergeben werden. Der folgende Befehl legt beispielsweise den Benutzer fest hat einen Wert von user
: ['foo', 'bar']
php artisan email:send foo barBeim Definieren von Optionen, die ein Array empfangen, sollte jedem an die Befehlszeile übergebenen Optionswert der Optionsname vorangestellt werden:
email:send {user} {--id=*} php artisan email:send --id=1 --id=2Beschreibung eingebenSie können Beschreibungen für Parameter und Optionen hinzufügen, indem Sie diese durch Doppelpunkte trennen. Wenn Sie etwas mehr Platz zum Definieren Ihres Befehls benötigen, können Sie ihn gerne auf mehrere Zeilen aufteilen:
/** * 命令行的名称及签名。 * * @var string */ protected $signature = 'email:send {user : The ID of the user} {--queue= : Whether the job should be queued}';Befehl E/AEingabe abrufenWenn der Befehl ausgeführt wird, müssen Sie natürlich die von empfangenen Parameter abrufen der Befehl und der Wert der Option. Sie können die Methoden
und argument
verwenden, um das Ziel zu erreichen: option
/** * 执行命令。 * * @return mixed */ public function handle(){ $userId = $this->argument('user'); // }Wenn Sie möchten, dass alle Parameter als
-Array erhalten werden, können Sie die Methode array
aufrufen: arguments
$arguments = $this->arguments();und Ähnlich wie beim Abrufen von Parametern kann die Methode
problemlos den Wert der Option abrufen. Um alle Optionen als Array abzurufen, verwenden Sie die Methode option
: options
// 获取一个指定的选项值 $queueName = $this->option('queue'); // 获取所有的选项值 $options = $this->options();Wenn der Parameter oder die Option nicht vorhanden ist, geben Sie
zurück. null
Interaktive Eingabe
Zusätzlich zur Anzeige der Ausgabe können Sie den Benutzer auch bitten, Eingaben zu machen, während der Befehl ausgeführt wird. Die Methode ask
fordert den Benutzer zur Eingabe auf und empfängt diese. Anschließend wird die Eingabe des Benutzers an Ihren Befehl übergeben: Die Methode
/** * 执行命令。 * * @return mixed */ public function handle(){ $name = $this->ask('What is your name?'); }
secret
ähnelt der Methode ask
, wenn jedoch die Der Benutzer gibt in der Konsole Folgendes ein: Der Eingabeinhalt ist unsichtbar. Diese Methode eignet sich, wenn der Benutzer vertrauliche Informationen wie ein Passwort eingeben muss:
$password = $this->secret('What is the password?');
Bestätigung anfordern
Wenn Sie den Benutzer bitten möchten, einige einfache Informationen zu bestätigen, Sie können die Methode confirm
verwenden. Standardmäßig gibt diese Methode false
zurück. Wenn der Benutzer jedoch y
oder yes
in die Antwort eingibt, wird true
zurückgegeben. Die Methode
if ($this->confirm('Do you wish to continue?')) { // }
Autocomplete
anticipate
kann verwendet werden, um mögliche Auswahlmöglichkeiten automatisch zu vervollständigen. Benutzer können die Aufforderung zur automatischen Vervollständigung weiterhin ignorieren und eine beliebige Antwort geben:
$name = $this->anticipate('What is your name?', ['Taylor', 'Dayle']);
Mehrere Auswahlmöglichkeiten
Wenn Sie Benutzern einige voreingestellte Auswahlmöglichkeiten bieten möchten, können Sie < verwenden 🎜> Methode. Sie können auch den Index des Standardwerts festlegen, um mit der Situation umzugehen, in der der Benutzer keine Wahl hat: choice
$name = $this->choice('What is your name?', ['Taylor', 'Dayle'], $defaultIndex);Ausgabe schreibenSie können
, line
, info
, comment
und verwenden question
Methode zum Senden der Ausgabe an das Terminal. Jede Methode verwendet die entsprechende error
-Farbe, um ihren Zweck anzuzeigen. Lassen Sie uns dem Benutzer beispielsweise einige allgemeine Informationen anzeigen. Im Allgemeinen ist es am besten, die Methode ANSI
zu verwenden, die den Ausgabeinhalt in Grün auf der Konsole anzeigt: info
/** * 执行命令。 * * @return mixed */ public function handle(){ $this->info('Display this on the screen'); }Um Fehlerinformationen anzuzeigen , verwenden Sie die
-Methode. Die Fehlermeldung wird in Rot angezeigt: error
$this->error('Something went wrong!');Wenn Sie die Ausgabe ohne Farbeinstellungen in der Konsole anzeigen möchten, verwenden Sie bitte die
-Methode: line
$this->line('Display this on the screen');Tabellenlayout Für die formatierte Ausgabe mehrspaltiger Daten ist die Methode
einfacher zu handhaben. Basierend auf den eingehenden Tabellenkopf- und Zeilendaten werden Breite und Höhe dynamisch berechnet: table
$headers = ['Name', 'Email']; $users = App\User::all(['name', 'email'])->toArray(); $this->table($headers, $users);FortschrittsbalkenFür zeitaufwändige Aufgaben ist dies unbedingt erforderlich um den Fortschritt voranzutreiben. Verwenden Sie das Ausgabeobjekt, um Fortschrittsbalken zu erstellen, zu laden und zu stoppen. Definieren Sie zunächst die Gesamtzahl der Schritte für die Aufgabe und laden Sie dann den Fortschrittsbalken jedes Mal, wenn die Aufgabe ausgeführt wird:
$users = App\User::all(); $bar = $this->output->createProgressBar(count($users)); $bar->start();foreach ($users as $user) { $this->performTask($user); $bar->advance(); }$bar->finish();Weitere Informationen zur erweiterten Verwendung finden Sie in der
Dokumentation zur Symfony-Fortschrittsbalken-Komponente.
Befehl registrieren
app/Console/Commands
Die Befehle im Verzeichnis werden registriert. Dies liegt daran, dass die commands
-Methode des Konsolenkerns load
aufruft. Tatsächlich können Sie load
nach Belieben aufrufen, um Artisan-Befehle in anderen Verzeichnissen zu scannen:
/** * 注册应用的命令 * * @return void */ protected function commands(){ $this->load(__DIR__.'/Commands'); $this->load(__DIR__.'/MoreCommands'); // ... }
Sie können den Klassennamen des Befehls auch manuell im app/Console/Kernel.php
-Attribut der $commands
-Datei registrieren. Wenn Artisan startet, werden die in diesem Attribut aufgeführten Befehle vom Service-Container analysiert und über Artisan registriert:
protected $commands = [ Commands\SendEmails::class ];
Programmaufrufbefehl
Manchmal ist es notwendig, Artisan-Befehle außerhalb der CLI auszuführen, beispielsweise beim Auslösen in einem Router oder Controller Handwerkerbefehl. Um den Aufruf zu implementieren, können Sie die Artisan
-Methode der call
-Fassade verwenden. call
Der erste Parameter der Methode akzeptiert den Befehlsnamen und der zweite Parameter akzeptiert die Befehlsparameter in Form eines Arrays. Der Exit-Code wird zurückgegeben:
Route::get('/foo', function () { $exitCode = Artisan::call('email:send', [ 'user' => 1, '--queue' => 'default' ]); // });
Alternativ können Sie den gesamten Artisan-Befehl als String an die call
-Methode übergeben:
Artisan::call('email:send 1 --queue=default');
Artisan
Die queue
-Methode der Fassade kann Übergeben Sie den Artisan-Befehl Queuing und überlassen Sie ihn dem Warteschlangenarbeitsprozess zur Hintergrundverarbeitung. Bevor Sie diese Methode verwenden, müssen Sie unbedingt die Warteschlange konfigurieren und den Warteschlangen-Listener ausführen:
Route::get('/foo', function () { Artisan::queue('email:send', [ 'user' => 1, '--queue' => 'default' ]); // });
Sie können auch Artisan angeben Verbindung oder Aufgabe wird per Befehl ausgelöst:
Artisan::queue('email:send', [ 'user' => 1, '--queue' => 'default' ])->onConnection('redis')->onQueue('commands');
Array-Wert übergeben
Wenn die Option zum Akzeptieren eines Arrays definiert ist, können Sie dies direkt tun Übergeben Sie ein Array an die Option:
Route::get('/foo', function () { $exitCode = Artisan::call('email:send', [ 'user' => 1, '--id' => [5, 13] ]); });
Übergeben Sie einen booleschen Wert
Wenn Sie eine Option ohne Optionswert angeben müssen, zum Beispiel migrate:refresh
--force
Option des Befehls, Sie können true
oder false
übergeben:
$exitCode = Artisan::call('migrate:refresh', [ '--force' => true, ]);
Intercalling of commands
call
-Methode kann andere Artisan-Befehle aufrufen. Die Methode call
akzeptiert einen Befehlsnamen und eine Reihe von Optionen:
/** * 执行控制台命令 * * @return mixed */ public function handle(){ $this->call('email:send', [ 'user' => 1, '--queue' => 'default' ]); // }
Wenn Sie die gesamte Ausgabe eines Konsolenbefehls unterdrücken möchten, können Sie die Methode callSilent
verwenden. Die Verwendung von callSilent
ist die gleiche wie call
:
$this->callSilent('email:send', [ 'user' => 1, '--queue' => 'default' ]);