Очередь почты в Ларавеле - PullRequest
       12

Очередь почты в Ларавеле

0 голосов
/ 01 апреля 2019

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

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

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, задание сохраняется в базе данных. Но это не может быть обработано. Я также запускаю php artisan queue:work, но ничего не делается с заданиями в базе данных. Любая помощь?

EDIT:

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

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

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

1 Ответ

0 голосов
/ 01 апреля 2019

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

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

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

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

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

    <?php

namespace App\Jobs;

use App\Jobs\Job;
use DB;
use Mail;
use Artisan;
use Illuminate\Contracts\Mail\Mailer;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...