コマンドバスイントロダクションLaravelコマンドバスは、シンプルで分かりやすい「コマンド」として実行する必要のあるアプリケーションのタスクをカプセル化する便利なメソッドです。コマンドの目的を理解するために、ポッドキャストをユーザーに購入してもらうアプリケーションを構築しているとしましょう。ユーザーがポッドキャストを購入すると、色々な処理を実行する必要が起きます。ユーザーのクレジットカードに課金したり、領収を表すデータベースへレコードを追加したり、購入の確認メールを送ったりです。そのユーザーがポッドキャストを購入できるのか、様々なバリデーションを行う必要もあるでしょう。コントローラーメソッドへ、こうしたロジックを全部突っ込むこともできます。多くの点で良くありません。コントローラは要求がされるだろう別のHTTPアクションもたくさん処理し、各コントローラーメソッドには複雑なロジックがつめ込まれ、膨れ上がり、結果として読みづらくなってしまうのが第一の欠点です。第二に、コントローラー外でポッドキャスト購入のロジックを再利用するのが難しいことです。第三に、ポッドキャスト購入ロジックをテストするため、HTTPリクエストのスタブを生成しなくてはなりませんし、アプリケーションへ送る完全なリクエストを作成しなくてはならないため、コントローラーのユニットテストが困難になることです。ロジックをコントローラーに詰め込む代わりに、例えばPurchasePodcastコマンドのように、「コマンド」オブジェクトとしてカプセル化することも選択できます。CLIで生成できます。PurchasePodcast生成されたクラスは、app/Commandsディレクトリーへ設置されます。生成されたコマンドには、デフォルトで2つのメソッドがあります。コンストラクターとhandleメソッドです。コンストラクターはコマンドへ適切なオブジェクトを渡すために使えます。一方のhandleメソッドは、コマンドを実行します。}}handleメソッドでも依存をタイプヒントで指定でき、サービスコンテナにより自動的に注入されます。}コマンドデスパッチコマンドはできました。やってデスパッチするのでしょう?もちろん、handleメソッドを直接呼び出すこともできます。コマンドをLaravel「コマンドバス」を通して実行する方法には、後ほど説明する多くの利点があります。アプリケーションのベースコントローラーを覗いてみれば、DispatchesCommandsトレイトが見つかります。このトレイトは、コントローラーからdispatchメソッドを呼び出せるようにします。);}コマンドバスはコマンド実行の面倒を見ます。呼びだされたIoCコンテナがhandleメソッドへ必要な依存を注入します。お望みであれば、どんなクラスへでもIlluminate\Foundation\Bus\DispatchesCommandsトレイトを付け加えることができます。クラスのコンストラクターを通して、コマンドバスのインスタンスを受け取りたいのであれば、Illuminate\Contracts\Bus\Dispatcherインターフェイスをタイプヒントに指定してください。最後に、Busファサードを使い、簡単にコマンドをデスパッチする方法を紹介します。);リクエストからコマンドのプロパティーをマップするHTTPリクエストの変数をコマンドへマップしたいと考えるのは当然でしょう。それぞれのリクエストを手動で無理やりマップする代わりに、Laravelでは簡単に実現できるヘルパメソッドを用意しています。DispatchesCommandsトレイトで使用できる、dispatchFromメソッドを取り上げてみてみましょう。$request);このメソッドは指定されたコマンドクラスのコンストラクターを調べ、それからHTTPリクエスト(もしくは他のArrayAccessオブジェクト)から変数を取り出し、必要なコマンドのコンストラクター引数を埋めます。コマンドクラスがコンストラクターで$firstName変数を取る場合、コマンドバスはHTTPリクエストからfirstNameパラメーターを取り出そうとします。dispatchFromメソッドはさらに第3引数に配列を指定できます。この配列はリクエストからは埋められないコンストラクター引数を埋めるために使用されます。'Taylor',]);コマンドのキュー投入コマンドバスは現在のリクエストサイクル中で、同期的にジョブを実行するだけではなく、Laravelのキュージョブとして非同期に実行する重要な手法も提供しています。同期的に実行する代わりに、どうやってコマンドバスへ、バックグラウンド処理を行うためにジョブをキューに入れろと指示するのでしょうか。最初に新しいコマンドを生成するときに、--queuedフラグをコマンドへ付けるだけです。--queuedすぐ気がつくでしょうが、これによりいくつかの機能がコマンドに追加されます。Illuminate\Contracts\Queue\ShouldBeQueuedインターフェイスとSerializesModelsトレイトです。これらは、コマンドバスにコマンドをキューに投入するように指示し、同時にコマンドのプロパティーとしてストアされたEloquentモデルを優雅にシリアライズ、非シリアライズします。存在するコマンドをキュー実行のコマンドに変更したければ、単にIlluminate\Contracts\Queue\ShouldBeQueuedインターフェイスを手動でクラスへ実装してください。これはメソッドを含んでおらず、主にデスパッチャーがコマンドへ投入する「目印のインターフェイス」として使用しています。それから、コマンドを通常通り書いてください。それがバスへデスパッチされると、バックグラウンドで処理するため自動的にキューへ投入します。キューされるコマンドのインターフェイスの詳細は、キューのドキュメントを参照してください。コマンドパイプラインハンドラにディスパッチされる前に、「パイプライン」中の他のクラスへ、コマンドを通すことができます。コマンドパイプラインは、実行するのがコマンドという違いだけで、まるでHTTPミドルウェアのように動作します!例えば、コマンド全体の操作をデータベーストランザクションでラップしたり、実行をログしたりできます。パイプをバスに追加するには、App\Providers\BusServiceProvider::bootメソッドから、ディスパッチャーのpipeThroughメソッドを呼び出します。'LogCommand']);コマンドのパイプは、ミドルウェアと同様に、handleメソッドで定義します。}}コマンドパイプのクラスは、IoCコンテナを通じて依存解決されるため、コンストラクターでタイプヒントによる依存を指定することもできます。コマンドパイプを「クロージャー」で定義することもできます。kawase(Translation).ドキュメントメンテナンス期間は終了しました。注目:アイコン:ページ内リンク設置(リンクがないヘッダーへの移動では、リンクがある以前のヘッダーのハッシュをURLへ付加します。閉じる移動クリックで即時移動します。適用ボタンクリック後に、全項目まとめて適用されます。Scaffoldスカフォールド型枠生成スカフィールドLargeスクリーン表示幅640px80%90%100%インデントなし1rem2rem3rem本文フォントコードフォントフォント適用確認フォントの指定フィールドから、フォーカスが外れると、当ブロックの内容に反映されます。EnglishのDisplayもPreviewしてください。フォント設定時、表示に不具合が出た場合、当サイトのクッキーを削除してください。バックスラッシュを含むインライン\Code\Blockの例です。以下はコードブロックの例です。}}設定を保存する前に、表示が乱れないか必ず確認してください。CSSによるフォントファミリー指定の知識がない場合は、フォントを変更しないほうが良いでしょう。