You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel Queue:如何在Job的handle方法中获取数据

嘿,我来帮你搞定这个问题!其实核心就是在创建Job的时候把需要的短信数据传递进去,然后在handle方法里直接调用就行,我给你一步步拆解清楚:

1. 让Job类接收并存储短信数据

首先,你的Job类需要在构造函数里接收从控制器传过来的短信参数(比如接收手机号、短信内容),并把这些参数存在类的公开属性里(默认生成的Job会自带SerializesModels trait,能帮你自动处理数据序列化,不用担心队列存储的问题)。

举个实际的代码例子:

namespace App\Jobs;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Twilio\Rest\Client;

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

    // 定义公开属性存储短信数据,方便handle方法直接调用
    public $recipientPhone;
    public $smsContent;

    /**
     * 创建Job实例时接收参数
     *
     * @param string $recipientPhone 接收短信的手机号
     * @param string $smsContent 要发送的短信内容
     * @return void
     */
    public function __construct(string $recipientPhone, string $smsContent)
    {
        $this->recipientPhone = $recipientPhone;
        $this->smsContent = $smsContent;
    }

    /**
     * 执行实际的短信发送逻辑
     *
     * @param Client $twilio 依赖注入Twilio客户端
     * @return void
     */
    public function handle(Client $twilio)
    {
        // 这里直接用构造函数里存的属性就行!
        $twilio->messages->create(
            $this->recipientPhone,
            [
                'from' => config('services.twilio.phone_number'), // 从配置文件取你的Twilio号码
                'body' => $this->smsContent
            ]
        );
    }
}

另外别忘了先在config/services.php里配置Twilio的凭据(这样依赖注入才能正常工作):

// config/services.php
return [
    // ...其他配置
    'twilio' => [
        'sid' => env('TWILIO_SID'),
        'token' => env('TWILIO_AUTH_TOKEN'),
        'phone_number' => env('TWILIO_PHONE_NUMBER'),
    ],
];
2. 在控制器里分发Job时传入POST数据

控制器接收POST请求后,先验证数据,然后把需要的参数传给Job的构造函数,再调用dispatch方法把Job扔进队列就行:

namespace App\Http\Controllers;

use App\Jobs\SendSmsViaTwilio;
use Illuminate\Http\Request;

class SmsQueueController extends Controller
{
    public function store(Request $request)
    {
        // 先验证请求数据的合法性
        $validatedData = $request->validate([
            'to' => 'required|phone', // 可以根据你的地区调整手机号验证规则
            'message' => 'required|string|max:1600', // Twilio单条短信最大字符数是1600
        ]);

        // 分发Job,把验证后的手机号和内容传进去
        SendSmsViaTwilio::dispatch($validatedData['to'], $validatedData['message']);

        return response()->json(['status' => '短信已加入发送队列'], 202);
    }
}
额外小提示:传递复杂数据

如果需要传递的是模型实例(比如用户模型),直接把模型传给Job构造函数就行,SerializesModels trait会自动只存储模型ID,执行Job的时候再重新获取完整模型,避免队列存储冗余数据:

// Job构造函数
public function __construct(User $user, string $smsContent)
{
    $this->user = $user;
    $this->smsContent = $smsContent;
}

// handle方法里调用
$twilio->messages->create(
    $this->user->phone,
    [
        'from' => config('services.twilio.phone_number'),
        'body' => $this->smsContent
    ]
);

内容的提问来源于stack exchange,提问作者Deepak Tiwari

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:33:52