it-swarm.com.de

Laravel Befehle und Jobs

Ich habe mich gefragt, was der Unterschied zwischen den verschiedenen befehlsähnlichen Klassen in Laravel 5.1 ist. Soweit ich sagen kann Laravel 5.1 hat Folgendes zur Verfügung:

  • Konsolenbefehle (artisan make:console)
  • Befehle (artisan make:command)
    • Handler (artisan make::command --handler)
  • Jobs (artisan make:job)

Ich bin direkt von 4.2 auf 5.1 gekommen, also weiß ich nicht, was zwischen 4.2 und 5.1 passiert ist, aber mir wurde gesagt, dass die mittleren ( nur Befehle) im Grunde genommen nicht wirklich sollen Sie werden nicht mehr verwendet. Sie befinden sich ab dem Zeitpunkt, zu dem warteschlangenfähige Jobs in 5.0 zu "Befehlen" wurden, aber Laravel seitdem haben sie sich dagegen entschieden und dienen nur der Kompatibilität. Ich ' Da diesbezüglich keine 100% igen Angaben gemacht werden, wäre eine Klarstellung wünschenswert.

Mein spezieller Anwendungsfall ist, dass ich einen Ort haben möchte, an dem eine eigenständige, ausführbare Aufgabe ausgeführt werden kann. Zum Beispiel, wenn Dateien, die älter als 5 Tage sind, aus einem bestimmten Verzeichnis entfernt werden (dies kann jedoch alles sein).

Das klingt zunächst wie ein Konsolenbefehl - ich möchte es zunächst einmal von artisan aus ausführen können. Aber ich möchte es vielleicht auch nach einem Zeitplan (großartig, artisan schedule:run Führt Konsolenbefehle aus). Aber ich möchte es vielleicht auch asynchron aus dem Code ausführen. Konsolenbefehle können synchron mit Artisan::call() ausgeführt werden, aber bei asynchronen Befehlen kommen (glaube ich) Warteschlangen an und es muss plötzlich ein Job sein.

Okay, wir haben einen Job. Wir können es jetzt aus dem Code in eine Warteschlange stellen, aber wie führen wir es als Handwerksbefehl (synchron) aus? Kann ich einfach einen Thin Console-Befehl erstellen und das Merkmal DispatchesJobs (oder den darin enthaltenen Code) hinzufügen und dann den Job auslösen? Muss der Job immer in eine Warteschlange gestellt werden, oder können wir einen Job synchron ausführen lassen (und im Idealfall auf die Ausgabe des Konsolenbefehls ausgeben?)? Die gleiche Frage gilt für die Ausführung nach einem Zeitplan - soll ich diese Konsole erstellen? Befehl und fügen Sie das zum Scheduler hinzu, oder kann ich den Scheduler veranlassen, den Job direkt auszuführen?

Und schließlich haben wir 'Befehle', die weder Konsolenbefehle noch Jobs sind. Wie ich bereits sagte, sagen mir die Leute, dass es sich nur um Hänger aus einer (irgendwie) rückgängig gemachten Laravel 5.0-Codeänderung handelt. Aber der Befehl artisan make Ist für sie immer noch vorhanden. Sie können also nicht das tot sein. Was ist außerdem mit einem Selbstbehandlungsbefehl (standardmäßig mit einer handle -Methode) und einer Methode, die eine Handlerklasse 'erfordert' (führen Sie artisan make:command --handler Aus)? Wie lassen Sie diese tatsächlich ausführen? Manuell mit (new App\Command\SomeCommand)->handle(); Oder (new App\handlers\SomeCommandHandler)->handle(new App\Command\SomeCommand), Oder gibt es ein verstecktes System, das ich nicht kenne (möglicherweise können sie mit dem Job-/Warteschlangen-Dispatcher versendet werden)? Sie können auch Befehle in der Warteschlange erstellen artisan make::command --queued. Wie unterscheiden sich diese also auch?

Ich denke, meine Frage läuft auf Folgendes hinaus:

  • Was ist der reale (semantische und funktionale Unterschied zwischen allen?
  • Was ist der richtige Weg, um sie zu "rennen"?
  • Welche Methode eignet sich am besten für die Ausführung eines im Allgemeinen eigenständigen Codebausteins, unabhängig davon, wie ich es für angemessen halte?

Ich habe in der Dokumentation Informationen zur Verwendung von Warteschlangen und zum Erstellen von Konsolenbefehlen gefunden, aber nichts darüber, wann genau sie verwendet werden sollen, oder wirklich irgendetwas in Befehlsklassen und Handlern.


Verwandt, aber nicht genau gleich (auch unbeantwortet): Laravel 5.1-Befehle und -Jobs

30
alexrussell

Ich sehe diese "Objekte" so: (Ich habe einige Codebeispiele aus einem meiner Nebenprojekte hinzugefügt)

Konsole

Dinge, die ich über die Befehlszeile ausführen möchte (Wie Sie in Ihrem Beispiel mit "Dateien löschen, die älter als x sind" erwähnt haben). Aber die Sache ist, Sie könnten die Geschäftslogik daraus in einen Befehl extrahieren.

Beispiel : Ein Konsolenbefehl mit einem Befehl zum Abrufen von Bildern aus Imgur. Die Klasse FetchImages enthält die eigentliche Geschäftslogik zum Abrufen von Bildern.

Befehl

Klasse, die die eigentliche Logik enthält. Sie sollten diesen Befehl auch in Ihrer Anwendung mit app()->make(Command::class)->handle() aufrufen können.

Beispiel : In Beispiel 1 genannter Befehl. Enthält eine Logik, die die eigentlichen API-Aufrufe an Imgur ausführt und zurückgegebene Daten verarbeitet.

Arbeitsplätze

Ich habe diese App mit Laravel 5.0 erstellt, also war jobs damals keine Sache. Aber wie ich sehe, sind Jobs wie Befehle, aber sie stehen in der Warteschlange und können versendet werden. (Wie Sie vielleicht in diesen Beispielen gesehen haben, implementieren diese Befehle Ihre erwähnten Schnittstellen SelfHandling und ShouldBeQueued).


Ich sehe mich als erfahrener Laravel Entwickler, aber diese Änderungen in Commands und Jobs sind ziemlich schwer zu verstehen.

BEARBEITEN: Aus den Laravel Docs:

Das Verzeichnis app/Commands wurde in app/Jobs umbenannt. Sie müssen jedoch nicht alle Befehle an den neuen Speicherort verschieben, und Sie können weiterhin die Befehle make: command und handler: command Artisan verwenden, um Ihre Klassen zu generieren.

Ebenso wurde das Verzeichnis app/Handlers in app/Listeners umbenannt und enthält jetzt nur noch Ereignis-Listener. Sie müssen Ihre vorhandenen Befehls- und Ereignishandler jedoch nicht verschieben oder umbenennen, und Sie können den Befehl handler: event weiterhin zum Generieren von Ereignishandlern verwenden.

Durch die Abwärtskompatibilität für die Ordnerstruktur Laravel 5.0 können Sie Ihre Anwendungen auf Laravel 5.1 aktualisieren und Ihre Ereignisse und Befehle langsam an den neuen Speicherorten aktualisieren, wenn dies der Fall ist ist praktisch für Sie oder Ihr Team.

21
stefanzweifel

Konsolenbefehle

Laravel hat seit einiger Zeit Konsolenbefehle. Sie sind im Grunde unverändert und funktionieren wie immer. In einfachen Worten sind sie das Äquivalent zu Routen für die Befehlszeile - der Einstiegspunkt in die Anwendung. Sie sind in keiner Weise verwandt mit ...

Der Befehlsbus

In Laravel 5.0 wurde eine Implementierung des Musters Command Bus - Befehlsbusbefehle eingeführt. (Ich glaube, diese wurden wegen der daraus resultierenden Verwechslung mit den CLI-Befehlen in Jobs umbenannt.).

Ein Befehlsbus als zwei Teile - ein Objekt, das einen auszuführenden Befehl mit allen erforderlichen Daten (den Job) und eine Klasse zum Ausführen des Befehls (den Handler) darstellt.

Der Handler

In laravel können Sie einen Job als Selbstbehandlung deklarieren, dh er verfügt über eine Handle-Methode.

Wenn Sie einen Befehlshandler registrieren möchten, können Sie bei einem Dienstanbieter Folgendes aufrufen:

app('Illuminate\Bus\Dispatcher')->maps(['Job' => 'Handler']);

dabei ist Job der Klassenname für den Job und Handler der Klassenname für den Handler.

Das Handler-Verzeichnis in laravel 5.0 war eine Möglichkeit, diese Beziehungen implizit zu deklarieren (dh EmailCommand im Befehlsordner hätte ein EmailCommandHandler im Handler-Ordner) .

Befehl absenden

Sie können Folgendes verwenden, um einen Befehl auszulösen.

app('Illuminate\Bus\Dispatcher')->dispatch(new EmailPersonCommand('[email protected]', $otherdata));

Warteschlangen

Jobs werden standardmäßig ausgeführt, sobald sie aufgerufen (oder versendet) werden. Wenn Sie sie als ShouldQueue festlegen, werden sie beim Versand immer an eine Warteschlange übergeben.

Wenn Sie sie manchmal synchron und zu anderen Zeiten asynchron ausführen möchten, können Sie $dispatcher->dispatchToQueue($job) aufrufen, wenn Sie möchten, dass sie in die Warteschlange gestellt werden. Dies ist alles, was intern passiert, wenn Sie einen ShouldQueue -Job an ->dispatch() übergeben.

bearbeiten: In die Warteschlange (oder nicht)

Ich habe mir gerade den Dispatcher genauer angesehen. Die Methode dispatch überprüft, ob der Befehl ein ShouldQueue ist, und leitet ihn entweder an dispatchToQueue oder dispatchNow weiter. Sie können eine dieser Methoden direkt anstelle von dispatch mit Ihrem Befehl aufrufen, wenn Sie das Standardverhalten überschreiben möchten.

In Ihrem Fall haben Sie je nach dem "Standard" -Verhalten Ihres Jobs (dh wird er normalerweise in die Warteschlange gestellt?) Folgende Möglichkeiten: - Haben Sie ihn ShouldQueue, und verwenden Sie dispatchNow in der CLI Befehl. - haben Sie es nicht ShouldQueue, und verwenden Sie dispatchToQueue, wo Sie es in Ihrem Code aufrufen.

Nach den Geräuschen würde ich das erstere tun.

28
stef

Nur eine Ergänzung zu den eigentlichen Antworten.

Jobs in Laravel> = 5.1 sind Befehle Bus in Laravel 5..

Es ist nur eine Namensänderung wegen der Verwechslung zwischen Console\Commands (Befehle werden von der Konsole ausgeführt) und The Command Bus (enthält Commands) für die Anwendungsaufgaben.

Sie sollten nicht verwechseln:

  • Command Bus: Wird zum "Einkapseln von Aufgaben Ihrer Anwendung" verwendet (von laravel 5.0 doc), das jetzt in Jobs umbenannt wird.
  • Console\Commands: Wird für "Artisan [...] die in Laravel enthaltene Befehlszeilenschnittstelle" verwendet (aus laravel 5.1 docs), die in Laravel unverändert ist seit 4.x
2
Ifnot