为了账号安全,请及时绑定邮箱和手机立即绑定

在 Laravel 中向作业添加参数后失败

在 Laravel 中向作业添加参数后失败

PHP
POPMUISE 2021-12-03 16:17:01
我之前编写的没有参数的作业现在需要它们。它旨在使用 Mail 类发送电子邮件。我现在需要使用参数执行此作业,但队列没有看到它们。我想知道我是否以错误的方式初始化 SendMailFinished 但应该没问题。我已经读到序列化存在问题,但我在 SendMailFinished 中添加了受保护的变量。class ReporteBCH implements ShouldQueue{    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;    /**     * Create a new job instance.     * No hay que pasar ninguna variable.     * @return void     */    public function __construct()    {        //    }    /**     * Busca todos los equipos del inventario, luego revisa el SCCM con sus relaciones y el bginfo     *     * @return void     */    public function handle()    {        $msg = 'Proceso terminado. Ver ' . url('');        $subj = 'Proceso BCH';        $mailto = env('MAIL_TO');        $send = new SendMailFinished($msg, $subj, $mailto);        $send->dispatch();    }}现在的问题是,当我从控制台启动它时,该过程失败了,因为它看不到参数,就好像我没有在构造函数中添加它们一样。SendMailFinished 看起来像这样:class SendMailFinished implements ShouldQueue{    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;    /**     * Create a new job instance.     *     * @return void     */    public $tries = 3;    protected $msg;    protected $subj;    protected $mailto;    public function __construct($msg, $subj, $mailto)    {        //        $this->msg = $msg;        $this->subj = $subj;        $this->mailto = $mailto;    }    /**     * Execute the job.     *     * @return void     */    public function handle()    {        //Envia correo cuando termine cola.        Mail::to($this->mailto)->queue(new TasksFinished($this->msg, $this->subj));    }}错误如下:Symfony\Component\Debug\Exception\FatalThrowableError: Too few arguments to function App\Jobs\SendMailFinished::__construct(), 0 passed in C:\laragon\www\reportes\vendor\laravel\framework\src\Illuminate\Foundation\Bus\Dispatchable.php on line 26 and exactly 3 expected in C:\laragon\www\reportes\app\Jobs\SendMailFinished.php:31我已经阅读了https://laravel.com/docs/5.8/queues#creating-jobs ,但对它了解不多,还有这个如何将参数发送到队列?
查看完整描述

2 回答

?
拉莫斯之舞

TA贡献1820条经验 获得超10个赞

好吧,最终的答案是参数不能像在普通类中一样传递,而是必须一次性将它们添加到调度类中。

这不起作用:

$send = new SendMailFinished($msg, $subj, $mailto);
        $send->dispatch();

这有效:

SendMailFinished::dispatch($msg, $subj, $mailto);

在 Laravel 问题中找到了解释


查看完整回答
反对 回复 2021-12-03
?
一只名叫tom的猫

TA贡献1906条经验 获得超3个赞

如何调用命令非常重要。问题是,当您在构造函数中定义变量时,您的命令需要一些数据。如果你在没有这些数据的情况下调用你的命令,构造函数将不会得到任何数据,你会得到一个异常。

首先,您需要更改您的命令签名,以期待一些参数(如果您还没有):

protected $signature = 'your:command {msg}{subject}{mailTo}'

稍后,当您调用命令时,您需要传递所有这些参数:

php artisan your:command parameter1 parameter2 parameter3

在官方文档中阅读更多内容


查看完整回答
反对 回复 2021-12-03
  • 2 回答
  • 0 关注
  • 201 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信