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
_を作成することもできます。
私の質問は次のように要約されると思います:
ドキュメントでキューの使用方法とコンソールコマンドの作成方法に関する情報を見つけましたが、正確にそれらをいつ使用するか、実際にはコマンドクラスとハンドラーについては何も知りませんでした。
関連しているがまったく同じではない(また、未回答): Laravel 5.1コマンドとジョブ
これらの「オブジェクト」は次のように見えます:(サイドプロジェクトの1つからいくつかのコード例を追加しました)
コマンドラインから実行するもの(「xより古いファイルを削除する」の例で説明したとおり)。しかし、問題は、そのビジネスロジックをcommandに抽出できることです。
例 :コンソールコマンドは、Imgurから画像を取得するコマンドを起動します。クラスFetchImages
には、画像を取得する実際のビジネスロジックが含まれています。
実際のロジックを含むクラス。 app()->make(Command::class)->handle()
を使用して、アプリケーションからこのコマンドを呼び出すこともできるはずです。
例 :例1で説明したコマンド。Imgurへの実際のAPI呼び出しを実行し、返されたデータを処理するロジックが含まれています。
私はこのアプリをLaravel 5.0で作成しました。そのためjobs
は当時のものではありませんでした。 (これらの例で見たように、これらのコマンドは前述のインターフェースSelfHandling
およびShouldBeQueued
を実装しています)。
私自身は経験豊富なLaravel開発者ですが、Commands
とJobs
のこれらの変更を理解するのは非常に困難です。
編集:Laravel Docs:
App/Commandsディレクトリの名前がapp/Jobsに変更されました。ただし、すべてのコマンドを新しい場所に移動する必要はありません。make:commandおよびhandler:command Artisanコマンドを引き続き使用してクラスを生成できます。
同様に、app/Handlersディレクトリはapp/Listenersに名前が変更され、イベントリスナーのみが含まれるようになりました。ただし、既存のコマンドハンドラーとイベントハンドラーを移動したり名前を変更したりする必要はなく、引き続きhandler:eventコマンドを使用してイベントハンドラーを生成できます。
Laravel 5.0フォルダ構造の下位互換性を提供することにより、アプリケーションをLaravel 5.1にアップグレードし、イベントとコマンドを新しい場所にゆっくりアップグレードすることができますあなたやあなたのチームにとって便利です。
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
を使用します。
その音から、私は前者をしたいと思います。
実際の答えに追加するだけです。
Laravel> = 5.1のジョブはLaravel 5.0のコマンドバスです。
アプリケーションタスクのConsole\Commands
(コンソールから実行されるコマンド)とCommand Bus
(Commands
を含む)が混同されるため、名前の変更のみです。
混同しないでください:
Command Bus
:Jobs
に名前が変更された「アプリケーションのタスクをカプセル化する」ために使用(laravel 5.0 docから)Console\Commands
:「laravel 5.1 docsからのLaravel 5.1 docs」の「Artisan [...] Laravelに含まれるコマンドラインインターフェイス」に使用されます。バツ