向 Laravel 作业传递参数不起作用

问题描述 投票:0回答:3

我之前读过这个问题的解决方案,但似乎我做错了其他事情,这就是我问的原因:通常解决方案是将参数添加到类的主体以及 __construct 方法中,但甚至这样做是行不通的。

<?php

namespace App\Jobs;

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

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));
    }

我尝试在修补程序中以这种方式通过队列运行它:

use App\Jobs\SendMailFinished;
$job = new SendMailFinished('Hola', 'Prueba', '[email protected]');
$job->dispatch();

TypeError:函数参数太少 App/Jobs/SendMailFinished::__construct(), 0 传入 C:/larragon/www/reportes/vendor/laravel/framework/src/Illuminate/Foundation/Bus/Dispatchable.php 在第 16 行,正好是预期的第 3 行

为什么即使在类中和实例化期间指定了所有参数后,在分派时仍然看不到任何参数。 (我也尝试过公开参数,但这是同一件事)。

laravel
3个回答
16
投票

当您调用

dispatch()
时,您应该将参数发送到那里。

尝试静态调用它

SendMailFinished::dispatch('Hola', 'Prueba', '[email protected]');

12
投票

在 Laravel 中,有两种方法可以将参数传递给调度作业。 首先是根据 Job 类的要求简单地调用

dispatch
dispatchNow
,就像调用类上的静态方法一样:

YourJob::dispatch(argument1, argument2, argument3);

第二个是在创建 Job 类的实例/对象时简单地传递参数,然后将对象传递给调度方法(始终在控制器中可用),例如:

$this->dispatch(new YourJob(argument1, argument2, argument3));

参数将在构造函数中可用,您可以将它们分配给类局部变量属性并在 Job 类中的任何位置使用。


0
投票

这与你的情况无关,但在我的情况下,我错过了我的工作课程中的

implements ShouldQueue
,如果它可能对任何人有帮助的话

© www.soinside.com 2019 - 2024. All rights reserved.