イベントとリスナーについては以前に学習しましたが、今回はジョブについて学習します。
コマンドライン phpArtisan make:job CompileReports を実行して、Job クラスの構造は単純です。一般的に、Job クラスの構造は単純です。このタスクのハンドル メソッドを呼び出すときの具体的なコードは次のとおりです:
class CompileReports extends Job implements SelfHandling{ /** * Create a new job instance. * * @return void */ public function __construct() { // } /** * Execute the job. * * @return void */ public function handle() { // }}
php 職人のヘルプ make:job を介して関連するパラメーターを確認でき、php 職人の make:job CompileReports を実行します。 --queued を実行し、結果を前のクラスと比較します。違いは、ShouldQueue インターフェイスを実装していることです。つまり、キュー順に実行できることを意味します。
デフォルトルートを Routes.php に追加します:
Route::get('reports', 'ReportsController@index');
コマンドラインを実行します php 職人 make:controller ReportsController --plain、ReportsController コントローラーを作成し、テスト メソッドを追加します。
class ReportsController extends Controller{ // public function index() { $job = new CompileReports(); $this->dispatch($job); return 'Done'; } }
ReportsController コントローラーのコントローラー親クラスで、デフォルトで定義されている DispatchesJobs を使用します。 dispatch( $job) メソッド。タスクをスケジュールするために使用されます。現時点で、ページへのアクセスの影響は次のとおりです。
CompileReports.php コードを書き換え、ファイル内の $reportId パラメーターを受け入れます。コンストラクター:
class CompileReportsextends Jobimplements SelfHandling, ShouldQueue{ protected $reportId; /** * Create a new job instance. * * @return void */ public function __construct($reportId) { // $this->reportId = $reportId; } /** * Execute the job. * * @return void */ public function handle() { // var_dump('Compiling the reports with the id '. $this->reportId .' within the Job class.'); }}
ReportsController コントローラーはリクエスト内のパラメーターを受け入れ、処理のためにジョブに転送します:
class ReportsController extends Controller{ public function index(Request $request) { $job = new CompileReports($request->input('reportId')); $this->dispatch($job); return 'Done'; }}
ページにアクセスした場合の影響は次のとおりです:
ReportsController でdispatchFrom メソッドが呼び出されます:
class ReportsController extends Controller{ // public function index(Request $request) { //$job = new CompileReports($request->input('reportId')); // $this->dispatchFrom(CompileReports::class, $request); $this->dispatchFrom('App\Jobs\CompileReports', $request); return 'Done'; } }
ディスパッチとdispatchFromは次のようにDispatchesJobsで定義されています:
trait DispatchesJobs{ /** * Dispatch a job to its appropriate handler. * * @param mixed $job * @return mixed */ protected function dispatch($job) { return app('Illuminate\Contracts\Bus\Dispatcher')->dispatch($job); } /** * Marshal a job and dispatch it to its appropriate handler. * * @param mixed $job * @param array $array * @return mixed */ protected function dispatchFromArray($job, array $array) { return app('Illuminate\Contracts\Bus\Dispatcher')->dispatchFromArray($job, $array); } /** * Marshal a job and dispatch it to its appropriate handler. * 整理参数列表,传递给job * @param mixed $job * @param \ArrayAccess $source * @param array $extras * @return mixed */ protected function dispatchFrom($job, ArrayAccess $source, $extras = []) { return app('Illuminate\Contracts\Bus\Dispatcher')->dispatchFrom($job, $source, $extras); }}
CompileReportsクラスの受信パラメータを書き換えます:
class CompileReportsextends Jobimplements SelfHandling, ShouldQueue{ protected $reportId; protected $type; /** * Create a new job instance. * * @return void */ public function __construct($reportId, $type) { // $this->reportId = $reportId; $this->type = $type; } /** * Execute the job. * * @return void */ public function handle() { // var_dump('Compiling the '. $this->type .' reports with the id '. $this->reportId .' within the Job class.'); }}
アクセス効果は次のとおりです:
ジョブに DispatchesJobs 参照を追加した後、ジョブのディスパッチを続行できます:
/*** Execute the job.** @return void*/public function handle(){ // var_dump('Compiling the '. $this->type .' reports with the id '. $this->reportId .' within the Job class.'); var_dump(sprintf('Compiling the %s report with the id %s within the Job class', $this->type, $this->reportId)); // 增加 DispatchesJobs 引用后,可继续分派 job if(true) { $this->dispatch(new DoSomethingElse); }}
アクセス効果は次のとおりです: