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
相关产品推荐
相关产品推荐

