web-dev-qa-db-ja.com

Laravel=コマンドとジョブ

Laravel 5.1。の異なるコマンドのようなクラスの違いは何だろうと思っていました。私が知る限り、Laravel 5.1には次のものがあります。

  • コンソールコマンド(_artisan make:console_)
  • コマンド(_artisan make:command_)
    • ハンドラー(_artisan make::command --handler_)
  • ジョブ(_artisan make:job_)

私は4.2から5.1にまっすぐに来たので、4.2と5.1の間で何が起こったのかわかりませんが、真ん中のもの(justコマンド)は基本的にそうではないと言われました本当にこれ以上使用されることになっています-5.0でキュー可能ジョブが「コマンド」になったときから入っていますが、Laravelはこれに反対して決定されており、互換性のためだけにあります。 、私はこの点で100%ではありませんので、説明をいただければ幸いです。

私の具体的なユースケースは、自己完結型の「実行可能な」タスクを配置する場所が欲しいということです。たとえば、特定のディレクトリから5日以上前のファイルを削除するもの(ただし、何でもできます)。

最初はこれはコンソールコマンドのように聞こえます-artisanから実行できるようにしたいです。しかし、スケジュールどおりにしたい場合もあります(素晴らしい、_artisan schedule:run_はコンソールコマンドを実行します)。しかし、コードから非同期に実行することもできます。コンソールコマンドはArtisan::call()を使用してsynchronouslyで実行できますが、非同期の場合、これは(私が思うに)キューが入る場所であり、突然ジョブになる必要があります。

さて、仕事があります。コードからキューに追加できるようになりましたが、アーティザンコマンドとして(同期的に)実行する方法を教えてください。シンコンソールコマンドを作成し、それにDispatchesJobs特性(またはその中のコード)を追加してから、ジョブをディスパッチできますか?ジョブは常にキューに移動する必要がありますか、それともジョブを同期的に実行できますか(理想的には、コンソールコマンドの出力に出力しますか?)同じ質問がスケジュールで実行する場合にも当てはまります。コマンドを実行してスケジューラに追加するか、スケジューラにジョブを直接実行させることができますか?

そして最後に、コンソールコマンドでもジョブでもない「コマンド」があります。前に言ったように、人々は、これらはLaravel 5.0のコード変更(ちょっと)が元に戻されたからだと思う。しかし_artisan make_コマンドはまだ存在しているので、 thatデッドにすることはできません。また、自己処理コマンド(デフォルトではhandleメソッドが付属)と 'requires 'ハンドラクラス(_artisan make:command --handler_を実行しますか?実際にこれらを実行するにはどうしますか?_(new App\Command\SomeCommand)->handle();_または_(new App\handlers\SomeCommandHandler)->handle(new App\Command\SomeCommand)_を手動で使用するか、知らない隠しシステムがあります(おそらくジョブ/キューディスパッチャーを使用してディスパッチできます)?また、「キュー」コマンド_artisan make::command --queued_を作成することもできます。

私の質問は次のように要約されると思います:

  • それらのすべての本当の(意味and機能)違いは何ですか?
  • それらを「実行」する正しい方法は何ですか?
  • 適切と思われる方法で、実行する必要のある一般的にスタンドアロンのコードを作成するという目的には、どちらが最適ですか?

ドキュメントでキューの使用方法とコンソールコマンドの作成方法に関する情報を見つけましたが、正確にそれらをいつ使用するか、実際にはコマンドクラスとハンドラーについては何も知りませんでした。


関連しているがまったく同じではない(また、未回答): Laravel 5.1コマンドとジョブ

30
alexrussell

これらの「オブジェクト」は次のように見えます:(サイドプロジェクトの1つからいくつかのコード例を追加しました)

コンソール

コマンドラインから実行するもの(「xより古いファイルを削除する」の例で説明したとおり)。しかし、問題は、そのビジネスロジックをcommandに抽出できることです。

:コンソールコマンドは、Imgurから画像を取得するコマンドを起動します。クラスFetchImagesには、画像を取得する実際のビジネスロジックが含まれています。

コマンド

実際のロジックを含むクラス。 app()->make(Command::class)->handle()を使用して、アプリケーションからこのコマンドを呼び出すこともできるはずです。

:例1で説明したコマンド。Imgurへの実際のAPI呼び出しを実行し、返されたデータを処理するロジックが含まれています。

仕事

私はこのアプリをLaravel 5.0で作成しました。そのためjobsは当時のものではありませんでした。 (これらの例で見たように、これらのコマンドは前述のインターフェースSelfHandlingおよびShouldBeQueuedを実装しています)。


私自身は経験豊富なLaravel開発者ですが、CommandsJobsのこれらの変更を理解するのは非常に困難です。

編集:Laravel Docs:

App/Commandsディレクトリの名前がapp/Jobsに変更されました。ただし、すべてのコマンドを新しい場所に移動する必要はありません。make:commandおよびhandler:command Artisanコマンドを引き続き使用してクラスを生成できます。

同様に、app/Handlersディレクトリはapp/Listenersに名前が変更され、イベントリスナーのみが含まれるようになりました。ただし、既存のコマンドハンドラーとイベントハンドラーを移動したり名前を変更したりする必要はなく、引き続きhandler:eventコマンドを使用してイベントハンドラーを生成できます。

Laravel 5.0フォルダ構造の下位互換性を提供することにより、アプリケーションをLaravel 5.1にアップグレードし、イベントとコマンドを新しい場所にゆっくりアップグレードすることができますあなたやあなたのチームにとって便利です。

21
stefanzweifel

コンソールコマンド

Laravelにはしばらくの間、コンソールの「コマンド」がありました。それらは基本的に変更されておらず、いつものように機能します。簡単に言えば、これらはコマンドラインのルート(アプリケーションへのエントリポイント)と同等です。彼らは決して関連していません...

コマンドバス

Laravel 5.0は_Command Bus_パターン-コマンドバスコマンドの実装を導入しました。 (これらとCLIコマンドの間に混乱が生じたため、これらはJobsに名前が変更されたと思います)。

2つの部分としてのコマンドバス-実行するコマンドを表すオブジェクト、必要なすべてのデータ(ジョブ)、およびコマンドを実行するクラス(ハンドラー)。

ハンドラー

Laravelでは、ジョブを自己処理するように宣言できます。つまり、ジョブ自体を処理します。

コマンドハンドラーを登録する場合は、サービスプロバイダーで次を呼び出すことができます。

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

ここで、Jobはジョブのクラス名であり、Handlerはハンドラーのクラス名です。

laravel 5.0のハンドラーディレクトリは、これらの関係を暗黙的に宣言する方法でした(つまり、commandsフォルダーのEmailCommandはhandlersフォルダーにEmailCommandHandlerを持つことになります) 。

コマンドのディスパッチ

次を使用して、コマンドをディスパッチできます。

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

キュー

デフォルトでは、ジョブは呼び出される(またはディスパッチされる)とすぐに実行されます。それらをShouldQueueとして設定すると、それらはディスパッチされるときに常にキューに渡されます。

同期的に実行する場合と、非同期で実行する場合は、それらをキューに入れたいときに$dispatcher->dispatchToQueue($job)を呼び出すことができます。これは、ShouldQueueジョブを->dispatch()に渡すときに内部的に発生するすべてです。

編集:キューイングする(またはしない)

ディスパッチャをもう少し見てきました。 dispatchメソッドは、コマンドがShouldQueueかどうかを確認し、dispatchToQueueまたはdispatchNowに転送します。デフォルトの動作をオーバーライドしたい場合は、コマンドでdispatchの代わりにこれらのメソッドのいずれかを直接呼び出すことができます。

したがって、あなたの場合、ジョブの「デフォルト」動作に応じて(つまり、通常はキューに入れられますか)次のいずれかです。-ShouldQueueを使用し、CLIでdispatchNowを使用します。コマンド。 -ShouldQueueを持たず、コード内で呼び出す場所にdispatchToQueueを使用します。

その音から、私は前者をしたいと思います。

28
stef

実際の答えに追加するだけです。

Laravel> = 5.1のジョブはLaravel 5.0のコマンドバスです

アプリケーションタスクのConsole\Commands(コンソールから実行されるコマンド)とCommand BusCommandsを含む)が混同されるため、名前の変更のみです。

混同しないでください:

  • Command BusJobsに名前が変更された「アプリケーションのタスクをカプセル化する」ために使用(laravel 5.0 docから)
  • Console\Commands:「laravel 5.1 docsからのLaravel 5.1 docs」の「Artisan [...] Laravelに含まれるコマンドラインインターフェイス」に使用されます。バツ
2
Ifnot