MeWrite Docs

Laravel Queue: Class setQueue does not exist

LaravelでメールキューイングするとClass setQueue does not existエラーが発生する問題

概要

LaravelでMailable(メール)をキューに投入しようとすると「Class setQueue does not exist」というエラーが発生します。特にPHP 7.3以降で発生しやすい問題です。

エラーメッセージ

ReflectionException: Class setQueue does not exist
Illuminate\Queue\CallQueuedHandler::failed(): Class setQueue does not exist
Error: Class 'setQueue' not found

原因

  1. Mailableクラスの継承問題: Queueableトレイトが正しく使用されていない
  2. シリアライズの問題: PHP 7.3でクロージャのシリアライズ方法が変更された
  3. キャッシュの問題: 古いクラスマップがキャッシュされている
  4. 名前空間の衝突: use文の記述ミス

解決策

1. Mailableクラスの正しい定義

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?php

namespace App\Mail;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
use Illuminate\Mail\Mailables\Content;
use Illuminate\Mail\Mailables\Envelope;
use Illuminate\Queue\SerializesModels;

class WelcomeEmail extends Mailable implements ShouldQueue
{
    use Queueable, SerializesModels;

    public function __construct(
        public $user
    ) {}

    public function envelope(): Envelope
    {
        return new Envelope(
            subject: 'Welcome Email',
        );
    }

    public function content(): Content
    {
        return new Content(
            view: 'emails.welcome',
        );
    }
}

2. キャッシュのクリア

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# すべてのキャッシュをクリア
php artisan cache:clear
php artisan config:clear
php artisan route:clear
php artisan view:clear

# Composerのオートロードを再生成
composer dump-autoload

# キューワーカーを再起動
php artisan queue:restart

3. 古い形式からの移行(Laravel 9以前)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
// 古い形式(Laravel 9以前)
class WelcomeEmail extends Mailable implements ShouldQueue
{
    use Queueable, SerializesModels;

    public $user;

    public function __construct($user)
    {
        $this->user = $user;
    }

    public function build()
    {
        return $this->view('emails.welcome')
                    ->subject('Welcome Email');
    }
}

4. キュー接続の確認

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
// config/queue.php
'connections' => [
    'database' => [
        'driver' => 'database',
        'table' => 'jobs',
        'queue' => 'default',
        'retry_after' => 90,
    ],

    'redis' => [
        'driver' => 'redis',
        'connection' => 'default',
        'queue' => env('REDIS_QUEUE', 'default'),
        'retry_after' => 90,
        'block_for' => null,
    ],
],

5. 明示的にキューを指定

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
// コントローラーでの使用
use App\Mail\WelcomeEmail;
use Illuminate\Support\Facades\Mail;

class UserController extends Controller
{
    public function register(Request $request)
    {
        $user = User::create($request->validated());

        // 方法1: onQueue()で明示的に指定
        Mail::to($user->email)
            ->queue((new WelcomeEmail($user))->onQueue('emails'));

        // 方法2: laterで遅延送信
        Mail::to($user->email)
            ->later(now()->addMinutes(5), new WelcomeEmail($user));

        return response()->json(['message' => 'User created']);
    }
}

6. Jobとして定義する(代替案)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?php

namespace App\Jobs;

use App\Mail\WelcomeEmail;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Facades\Mail;

class SendWelcomeEmail implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    public function __construct(
        public $user
    ) {}

    public function handle(): void
    {
        Mail::to($this->user->email)->send(new WelcomeEmail($this->user));
    }
}

// 使用
SendWelcomeEmail::dispatch($user);

7. SerializesModelsの確認

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
// Eloquentモデルを渡す場合は必ずSerializesModelsを使用
use Illuminate\Queue\SerializesModels;

class WelcomeEmail extends Mailable implements ShouldQueue
{
    use Queueable, SerializesModels;

    // モデルはシリアライズ時にIDのみ保存され、
    // ジョブ実行時に再取得される
    public $user;
}

デバッグ方法

1
2
3
4
5
6
7
8
// キューに入れずに同期的に送信してテスト
Mail::to($user->email)->send(new WelcomeEmail($user));

// 失敗したジョブを確認
php artisan queue:failed

// 失敗したジョブを再試行
php artisan queue:retry all

よくある間違い

  • ShouldQueueインターフェースを実装しているのにQueueableトレイトを使っていない
  • SerializesModelsを忘れてEloquentモデルをシリアライズしようとする
  • キャッシュクリア後にキューワーカーを再起動しない
  • PHP 7.3以前のコードをそのまま使っている

関連エラー

参考リンク

Laravel の他のエラー

最終更新: 2025-12-14