- Laravelの話をする時は必ずバージョンを書く。
- Laravelの使い方を覚える方法は「公式ドキュメントを読む」以外には絶対に存在しない。すでに「公式ドキュメント以外は読むな」が常識。英語のドキュメントをChromeで翻訳して読めばいい。
まずキューとは何かを理解してないのでは。
https://laravel.com/docs/11.x/queues
コントローラーの流れとは別でバックグラウンドで処理するのが本来のキュージョブ。
MyJob::dispatch()
自体は正しく動いている。
「MyJobは後でバックグラウンドで動かして」とお願いするところまで。キューに入れてるだけでMyJobの中身は動いてない。
なぜ本と違うのかというとLaravel11で変わったから。
Laravel11ではQUEUE_CONNECTION=database
https://github.com/laravel/laravel/blob/708fdb1a36fd4567a2b7fd7557436536005fe4d2/.env.example#L37
Laravel10までは長らくQUEUE_CONNECTION=sync
https://github.com/laravel/laravel/blob/7effeb99ec1568f006ed95e60d3e7dfeed1b8160/.env.example#L21
syncドライバーではMyJob::dispatch()
はその場で即実行される。
MyJobでのPersonの変更が反映されるのでその後のPerson::get()で更新後のデータが得られる。
databaseドライバーではキューに入れるだけでMyJobは実行されない。
Personが変更されてないのでPerson::get()も変わらない。
本と同じ結果にしたいならMyJob::dispatchSync($person)
にすればいいだけ。強制的にsyncで実行。
間違ったジョブの使い方だけど。
元凶は「デフォルトがsyncドライバーだから偶然上手く動いてただけのことを普通の使い方のように書いてるその本」
ついでにbindMethodは意味不明。正しいのはMyJob::class.'@handle'
だろうけどそんなところを指摘する以前の話でbindMethodなんて使わない。このコードは不要だろう。
$this->app->bindMethod(MyJob::class.'handle', function($job, $app)
{
return $job->handle();
});
何もかも間違ってるその本はやばすぎる…。明らかにLaravelを知らない初心者が適当に触ってたまたま上手く行ったことを書いてるだけ。