#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
Затем выполните код.