Laravel Befehle und Jobs
Ich Frage mich, was der Unterschied ist zwischen den verschiedenen Befehl-wie Klassen in Laravel 5.1. Soweit ich sagen kann, Laravel 5.1 hat die folgenden zur Verfügung:
- Konsolen-Befehle (
artisan make:console
) - Befehle (
artisan make:command
)- Handler (
artisan make::command --handler
)
- Handler (
- Arbeitsplätze (
artisan make:job
)
Ich komme gerade von 4.2 auf 5.1, also ich weiß nicht, was passiert ist zwischen 4.2 und 5.1, aber mir wurde gesagt, dass das mittlere (nur Befehle) sind im Grunde nicht wirklich, sollte nicht mehr verwendet werden - Sie sind aus, wenn die Warteschlange-in der Lage jobs wurde 'Befehle' in der 5.0, aber Laravel seit beschlossen, gegen diese, und Sie sind nur für die Kompatibilität. Allerdings bin ich nicht 100% auf diesen Punkt, so dass eine Klärung wäre sehr hilfreich.
Meinen speziellen use-case ist, ich möchte ein Ort, um eine eigenständige 'runnable' Aufgabe. Zum Beispiel, etwas, dass die Dateien entfernen, die älter als 5 Tage von einem gegebenen Verzeichnis (es könnte aber etwas tun).
Dies klingt zunächst wie eine Konsole mit dem Befehl - ich möchte in der Lage sein, um Sie auszuführen aus artisan
für einen start. Aber ich kann auch wollen, dass es auf einem Zeitplan (große, artisan schedule:run
läuft console-Befehle). Aber ich kann auch wollen, um es auszuführen asynchron von code. Konsole-Befehle ausgeführt werden können synchron mit Artisan::call()
aber für asynchrone, dieser ist (glaube ich), wo Warteschlangen kommen, und es hat plötzlich eine Arbeit ist.
Okay, so haben wir einen job. Wir können jetzt hinzufügen, dass es zu einer Warteschlange von code, aber wie wollen wir Sie umsetzen, wie ein Handwerker-Befehl (synchron)? Kann ich einfach ein dünne console-Befehl und fügen Sie die DispatchesJobs
Eigenschaft (oder den code darin), und dann der Versand der job? Die Arbeit macht immer gehen Sie auf eine Warteschlange oder wir machen einen job bei synchron ausführen (und, im Idealfall, die Ausgabe in der Konsole Befehl?) Die gleiche Frage gilt für das ausführen auf einem Zeitplan - soll ich zum erstellen dieser Befehl console und fügen Sie, dass der scheduler, oder kann ich den scheduler-führen Sie den Auftrag direkt?
Schließlich haben wir 'Befehle', die nicht console-Befehle noch Aufträge. Wie ich schon sagte, die Leute sagen mir, dies sind nur Mitläufer, die aus einer Laravel 5.0-code ändern, das war (irgendwie) zurückgesetzt. Aber die artisan make
Befehl noch vorhanden ist für Sie, so können Sie nicht sein dass tot. Auch, was ist der deal mit einem self-handling-Befehl (der Standard, kommt mit einem handle
- Methode) und eine, die 'erfordert' eine handler-Klasse (run artisan make:command --handler
)? Wie wollen Sie eigentlich machen diese ausführen? Manuell mit (new App\Command\SomeCommand)->handle();
oder (new App\handlers\SomeCommandHandler)->handle(new App\Command\SomeCommand)
oder gibt es da eine versteckte system-weiß ich nicht (vielleicht kann Sie ausgelöst werden, Sie job/queue dispatcher)? Sie können auch erstellen 'in der Warteschlange' Befehle artisan make::command --queued
also wie unterscheiden sich diese?
Ich denke, meine Frage läuft darauf hinaus, die folgenden:
- Was ist die richtige (semantische und funktionelle) Unterschied zwischen den allen?
- Was ist der richtige Weg, um das "ausführen"?
- Welche ist am besten für meine Zwecke einer allgemein-standalone-bit-code, der ausgeführt werden muss, in welcher Weise auch immer-ich fühle mich geeignet?
Fand ich Informationen in der Dokumentation nach, wie man Warteschlangen und erstellen von console-Befehlen, aber nichts auf genau, Wann Sie zu verwenden oder wirklich alles auf Kommando-Klassen und Handler.
Verwandten, aber nicht genau das gleiche (auch unbeantwortet): Laravel 5.1 Befehle und Aufträge
InformationsquelleAutor der Frage alexrussell | 2015-08-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sehe ich die "Objekte" so auf: (ich habe einige code-Beispiele, die von meiner Seite Projekte)
Konsole
Dinge, die ich will, um die Ausführung von der Kommandozeile (Wie du erwähnt hast bei deinem Beispiel mit "Dateien Löschen älter als x"). Aber die Sache ist, ziehen Sie die business-Logik zu Befehl.
Beispiel: Ein console command mit Feuer einen Befehl zu Holen Bilder von Imgur. Die Klasse
FetchImages
enthält die eigentliche Geschäftslogik zum abrufen der Bilder.- Befehl
Klasse enthält die eigentliche Logik. Sie sollten auch in der Lage sein rufen Sie diesen Befehl von Ihrer Anwendung mit
app()->make(Command::class)->handle()
.Beispiel :- Befehl in Beispiel 1. Enthält Logik, die nicht die tatsächlichen API-Aufrufe zum Imgur-und Prozess-Daten zurückgegeben.
Arbeitsplätze
Ich habe diese app mit Laravel 5.0 so
jobs
waren nicht eine Sache zurück dann. Aber wie ich es sehe, werden die Aufträge wie Befehle, aber Sie sind in der Warteschlange und ausgelöst werden können. (Wie Sie vielleicht gesehen haben, in diesen Beispielen, die diese Befehle umsetzen, Ihre erwähnten SchnittstellenSelfHandling
undShouldBeQueued
).Sehe ich mich selbst als erfahrene Laravel Entwickler, aber diese änderungen in
Commands
undJobs
sind ziemlich schwer zu verstehen.BEARBEITEN:
Aus der Laravel Dokumentation:
InformationsquelleAutor der Antwort stefanzweifel
Konsole Befehle
Laravel hatte-Konsole "Befehle" für einige Zeit. Sie sind im Grunde unverändert, und arbeiten, wie Sie immer haben. In einfachen Worten, Sie sind das äquivalent der Routen für die Kommandozeile, die den Einstiegspunkt in die Anwendung. Sie sind in keiner Weise im Zusammenhang...
Den Befehl Bus
Laravel 5.0 vorgestellt, eine Umsetzung der
Command Bus
Muster - Kommando-Bus-Befehle. (Ich glaube, diese wurden umbenannt, um Arbeitsplätze wegen der Verwirrung zwischen Ihnen und der CLI Befehle).Einen Befehl-bus wie zwei Teile - ein Objekt repräsentiert ein Kommando ausgeführt werden soll, mit allen Daten, die er braucht (der job), und einer Klasse, um den Befehl auszuführen (der Hundeführer).
Der Hf
In laravel, Sie können erklären, einen job, um selbst das handling - das heißt, es hat eine handle-Methode selbst.
Wenn Sie möchten, registrieren Sie einen command-handler, können Sie die folgenden in einem service-Anbieter:
dem Job ist die Klasse name für den job, und der Handler ist der name der Klasse für die handler.
Handler Verzeichnis in laravel 5.0 war ein Weg, der implizit deklarieren diese Beziehungen (dh.
EmailCommand
im Ordner "commands" hätte einEmailCommandHandler
in der Handler-Ordner).Absendung einer Befehl
Können Sie die folgende dispatch-Befehl.
Warteschlangen
Jobs, standardmäßig, ausgeführt werden, sobald Sie aufgerufen werden (oder versandt). Einstellung Sie als
ShouldQueue
immer geben Sie Sie in eine queue, wenn Sie versendet werden.Wenn Sie möchten, führen Sie manchmal synchron und asynchron zu anderen Zeiten, rufen Sie
$dispatcher->dispatchToQueue($job)
wenn Sie wollen, dass Sie in die Warteschlange gestellt werden. Das ist alles, was geschieht innerlich, wenn Sie an einemShouldQueue
job zu->dispatch()
.edit: Queuing (oder auch nicht)
Habe ich gerade einen längeren Blick an den dispatcher. Die
dispatch
- Methode überprüft, ob der Befehl eineShouldQueue
und entweder leitet Sie zudispatchToQueue
oderdispatchNow
. Sie können den Anruf entweder von diesen Methoden, sondern direktdispatch
mit dem Befehl, sollten Sie es wünschen, überschreiben Sie die Standard-Verhalten.Also in deinem Fall, je nachdem, was der "default" - Verhalten von Ihrem job (dh. es wird üblicherweise in eine Warteschlange gestellt?) entweder:
- es
ShouldQueue
, und verwenden SiedispatchNow
in der CLI-Befehl.- haben es nicht
ShouldQueue
, und verwenden SiedispatchToQueue
wo Sie nennen es in Ihrem code.Von den Klängen der es, das ich tun würde, die früheren.
InformationsquelleAutor der Antwort stef
Nur eine Ergänzung zu den eigentlichen Antworten.
Jobs in Laravel >= 5.1 sind die Befehle Bus in Laravel 5.0.
Es ist nur eine Benennung ändern, wegen der Verwechslungen zwischen
Console\Commands
(Befehle ausführen von der Konsole aus) und DenCommand Bus
(mitCommands
) für die Anwendung Aufgaben.Sollten Sie nicht verwechseln :
Command Bus
: verwendet für "Kapselung Aufgaben Ihre Anwendung" (von laravel 5.0 doc), die ist jetzt umbenannt in einenJobs
Console\Commands
: verwendet für "Handwerker [...] die command-line-interface enthalten mit Laravel" (von laravel 5.1 docs), die unverändert in Laravel seit 4.xInformationsquelleAutor der Antwort Ifnot