Artisan-Befehlszeile


Artisan Befehlszeile

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 bar

Beim 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=2

Beschreibung eingeben

Sie 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/A

Eingabe abrufen

Wenn 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 schreiben

Sie 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);

Fortschrittsbalken

Fü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'
 ]);
Dieser Artikel wurde zuerst auf der Website LearnKu.com veröffentlicht.