Laravel — как передать переменную от контроллера к заданию

#laravel

Вопрос:

Извините, если это вопрос для новичков.

Я обычно отправлял электронные письма непосредственно через контроллер, вот так:

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

Как вы можете видеть, я также передаю $user в электронное письмо, где я могу использовать информацию этого пользователя, например «Здравствуйте {{$user->имя пользователя}}!»

Но теперь вместо этого я хочу ставить электронные письма в очередь, поэтому в моем контроллере теперь у меня есть это:

 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] местный.ОШИБКА: Неопределенное свойство: AppJobsRegisterConfirmationJob::$user {«исключение»:»[объект] (Исключение ошибки(код: 0): Неопределенное свойство: AppJobsRegisterConfirmationJob::$пользователь в /home/vagrant/проекты/основной/приложение/Задания/RegisterConfirmationJob.php:37) [трассировка стека]

Почему это происходит?

Редактировать:

Как и было запрошено, вот весь мой класс RegisterConfirmationJob:

 <?php

namespace AppJobs;

use AppMailRegisterConfirmation;
use AppUser;
use IlluminateSupportFacadesMail;

use IlluminateBusQueueable;
use IlluminateContractsQueueShouldBeUnique;
use IlluminateContractsQueueShouldQueue;
use IlluminateFoundationBusDispatchable;
use IlluminateQueueInteractsWithQueue;
use IlluminateQueueSerializesModels;

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

Комментарии:

1. вы определили $user свойство в RegisterConfirmation классе?

2. можете ли вы опубликовать весь RegisterConfirmationJob файл класса?

3. @DaviMendesDev хорошо, я отредактировал сообщение

Ответ №1:

Все просто, вы не объявили $user свойством класса, вот в чем смысл ошибки.

Я рекомендую вам объявить его общедоступным, чтобы использовать его в шаблоне blade

Комментарии:

1. Как мне объявить его как класс? Я думал, что это уже произошло, когда я передал «Пользователь $пользователь» в __construct?

2. Спасибо, что это работает на меня. Публичные $ваши возможности после занятий.

Ответ №2:

Да, братан, это не проблема Laravel, это проблема определения класса PHP, ты можешь решить это, объявив $user свойство вот так:

 <?php

namespace AppJobs;

use AppMailRegisterConfirmation;
use AppUser;
use IlluminateSupportFacadesMail;

use IlluminateBusQueueable;
use IlluminateContractsQueueShouldBeUnique;
use IlluminateContractsQueueShouldQueue;
use IlluminateFoundationBusDispatchable;
use IlluminateQueueInteractsWithQueue;
use IlluminateQueueSerializesModels;

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