【问题标题】:Laravel - how to pass variable from controller to jobLaravel - 如何将变量从控制器传递到作业
【发布时间】:2021-09-20 03:44:39
【问题描述】:

对不起,如果这是一个菜鸟问题。

我以前直接通过控制器发送电子邮件,如下所示:

Mail::to($user)->send(new RegisterConfirmation($user));

如您所见,我还将 $user 传递到电子邮件中,在那里我可以使用该用户的信息,例如“Hello {{$user->username}}!”

但现在我想对电子邮件进行排队,所以在我的控制器中我现在有这个:

RegisterConfirmationJob::dispatch($user);

在我的工作中,我有以下几点:

public function __construct(User $user)
{
    $this->user = $user;
}

public function handle()
{
    $user = $this->user;
    Mail::to($user)->send(new RegisterConfirmation($user));
}

当我运行它时,它返回以下错误:

[2021-07-09 20:33:57] local.ERROR:未定义的属性: App\Jobs\RegisterConfirmationJob::$user {"异常":"[对象] (ErrorException(代码:0):未定义的属性: App\Jobs\RegisterConfirmationJob::$user at /home/vagrant/projects/mainchan/app/Jobs/RegisterConfirmationJob.php:37) [堆栈跟踪]

为什么会这样?

编辑:

根据要求,这是我的整个 RegisterConfirmationJob 课程:

<?php

namespace App\Jobs;

use App\Mail\RegisterConfirmation;
use App\User;
use Illuminate\Support\Facades\Mail;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldBeUnique;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;

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

    public function __construct(User $user)
    {
        $this->user = $user;
    }


    public function handle()
    {
        $user = $this->user;
        Mail::to($user)->send(new RegisterConfirmation($user));
    }
}

【问题讨论】:

  • 您是否在RegisterConfirmation 类上定义了$user 属性?
  • 你能发布整个RegisterConfirmationJob类文件吗?
  • @DaviMendesDev 好的,我编辑了帖子

标签: laravel


【解决方案1】:

很简单,你没有将 $user 声明为类属性,这就是错误的含义。

我建议您将其声明为公共属性以在刀片模板中使用它

【讨论】:

  • 如何将它声明为一个类?当我在 __construct 中传递“User $user”时,我认为这已经发生了?
  • 谢谢它对我有用。课后公开 $yourVariable。
【解决方案2】:

是的,兄弟,这不是 Laravel 的问题,而是 PHP 类定义的问题,你可以通过声明 $user 属性来解决这个问题,如下所示:

<?php

namespace App\Jobs;

use App\Mail\RegisterConfirmation;
use App\User;
use Illuminate\Support\Facades\Mail;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldBeUnique;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;

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

    protected $user; // you forgot of put this line

    public function __construct(User $user)
    {
        $this->user = $user;
    }


    public function handle()
    {
        $user = $this->user;
        Mail::to($user)->send(new RegisterConfirmation($user));
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-08
    • 1970-01-01
    • 1970-01-01
    • 2017-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多