Постановка почты в очередь в Laravel

#php #laravel #email #queue

#php #laravel #Адрес электронной почты #очередь

Вопрос:

Я хотел бы отправлять почту пользователю после создания учетной записи на моем веб-сайте, и я хотел бы использовать очереди для их отправки. Я использую фреймворк PHP Laravel.

Мой контроллер обрабатывает запрос после нажатия на «Создать учетную запись»:

 class LoginController extends Controller
{
   ...
   public function register(Request $request) {
      ...
      $mail = (new RegisterRequest($user))->onConnection("database")->onQueue("emailsQueue");
      Mail::queue($mail);
      ...
   }
}
  

Тогда у меня есть этот класс RegisterRequest (для отправки по почте):

 class RegisterRequest extends Mailable
{
    use Queueable, SerializesModels;

    protected $user;

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

    public function build()
    {

        return $this->from('user@example.com')
            ->to($this->user->email)
            ->subject("Confirm your Email Address")
            ->view('emails.register.request')
            ->with("registration_token", $this->user->registration_token);
    }
}
  

Как вы можете видеть, я использую реляционную базу данных для хранения заданий. И действительно, после вызова метода LoginController register задание сохраняется в базе данных. Но это не может быть обработано. Я также запускаю php artisan queue:work , но ничего не делается с заданиями в базе данных. Есть помощь?

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

Итак, я только что узнал, что выбор заданий из очереди выполняется с помощью SQL, выбирающего имя очереди по умолчанию. Но я отправляю письма в очередь ’emailsQueue’. Итак, сейчас я запускаю Queue Worker следующим образом: php artisan queue:work --queue=emailsQueue и пока все работает нормально. Но как я могу выбирать задания из каждой очереди в базе данных? Вероятно, это не лучшая попытка, верно? Не имело бы никакого смысла иметь именованные очереди, верно? Но, допустим, у меня есть одна очередь для обработки запросов на регистрацию учетных записей, другая очередь для запросов на изменение пароля и так далее… Поэтому я думаю, что имеет смысл обрабатывать каждую очередь. Итак, как я могу это сделать? Можно ли это сделать, просто перечислив очереди следующим образом?

php artisan queue:work --queue=registerAccountEmailQueue,changePasswordEmailQueue...

Что именно делает запуск php artisan queue:work ? Я думал, что это команда для запуска всех очередей.

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

1. есть ли какая-либо запись в сбойных заданиях?

2. Нет, все, что делается, — это сохранение записи в таблицу базы данных ‘jobs’. Больше ничего не сделано.

3. какой у вас драйвер очереди в базе данных env или sync?

4. это «база данных»

5. попробуйте этот подход: Mail::to($user)->отправить (новый запрос регистрации);

Ответ №1:

Используйте базу данных драйвера очереди.

В контроллере вы должны написать

     $this->dispatch(new SendNotifyMail($data));
  

Это передаст вашу почту $data в очередь. здесь SendNotifyMail используется как класс задания. Таким образом, вы также должны использовать это в контроллере, подобном use AppJobsSendNotifyMail; .

Затем создайте файл в папке Jobs с именем SendNotifyMail

     <?php

namespace AppJobs;

use AppJobsJob;
use DB;
use Mail;
use Artisan;
use IlluminateContractsMailMailer;
use IlluminateQueueSerializesModels;
use IlluminateQueueInteractsWithQueue;
use IlluminateContractsQueueShouldQueue;

class SendNotifyMail extends Job implements ShouldQueue
{
    use InteractsWithQueue, SerializesModels;
    public $timeout = 300; // default is 60sec. You may overwrite like this
    protected $data;
    public function __construct($data)
    {
        $this->data = $data;
    }

public function handle(Mailer $mailer)
{
    $data = $this->data; // retrieve your passed data to variable
    // your mail code here
  }
}
  

В вашей команде вам нужно написать

 php artisan queue:listen
  

или

 php artisan queue:work
  

Затем выполните код.