【问题标题】:Fail after adding parameters to job in Laravel在 Laravel 中向作业添加参数后失败
【发布时间】:2019-08-23 13:54:48
【问题描述】:

我之前编写的没有参数的作业现在需要它们。它旨在使用 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,但没有太多要了解的内容,还有这个How to send parameters to queues?

【问题讨论】:

  • 表单控制台怎么称呼?
  • 带有命令类。这就是 \Log::info('Comienza creación reporte'); $job = 新的 ReporteBCH; $job->dispatch();
  • 对不起,当您尝试调用命令时,您在控制台中输入了什么?
  • 这不相关,我添加的变量在类中,之前不需要添加它们,并且在向构造函数添加参数之前,我之前使用过这个工作没有任何问题。

标签: php laravel laravel-queue


【解决方案1】:

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

这不起作用:

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

这行得通:

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

在 Laravel 问题中找到 explanation

【讨论】:

    【解决方案2】:

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

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

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

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

    php artisan your:command parameter1 parameter2 parameter3
    

    在官方documentation阅读更多内容。

    【讨论】:

    • 这不能回答我的问题,因为变量在工作中。我只是碰巧从一个命令中执行了那个工作。这是我在上面粘贴的第一段代码。
    • 你试过了吗?你的变量是在你的工作中定义的,但它们没有得到任何值,因为你在调用命令时没有传递这些值。
    • 变量在上面粘贴的句柄内。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-19
    • 1970-01-01
    • 2022-05-20
    • 1970-01-01
    • 2019-06-03
    • 2018-12-30
    相关资源
    最近更新 更多