Метод queue
Метод queue класса Mail применяется для постановки письма в очередь на отправку. Он работает асинхронно и не блокирует выполнение основного кода. Первым параметром передаётся класс Mailable, вторым - массив данных для передачи в представление, третьим - экземпляр замыкания для настройки сообщения.
Синтаксис
<?php
Mail::queue($mailable, $data, $callback);
?>
Пример
Создадим класс Mailable для приветственного письма:
<?php
namespace AppMail;
use IlluminateBusQueueable;
use IlluminateMailMailable;
use IlluminateMailMailablesContent;
use IlluminateQueueSerializesModels;
class WelcomeMail extends Mailable
{
use Queueable, SerializesModels;
public $user;
public function __construct($user)
{
$this->user = $user;
}
public function content(): Content
{
return new Content(
view: 'emails.welcome',
);
}
}
?>
Отправим письмо через очередь с данными пользователя:
<?php
namespace AppHttpControllers;
use AppMailWelcomeMail;
use AppModelsUser;
use IlluminateSupportFacadesMail;
class UserController extends Controller
{
public function register()
{
$user = User::create([
'name' => 'John Doe',
'email' => 'john@example.com',
]);
Mail::queue(new WelcomeMail($user));
return redirect()->route('home');
}
}
?>
Результат выполнения кода:
"Письмо добавлено в очередь на отправку"
Пример с замыканием
Отправим письмо через очередь с дополнительной настройкой через замыкание:
<?php
namespace AppHttpControllers;
use AppMailOrderConfirmation;
use IlluminateSupportFacadesMail;
class OrderController extends Controller
{
public function placeOrder()
{
$order = ['id' => 123, 'total' => 99.99];
Mail::queue(new OrderConfirmation($order), [], function ($message) {
$message->from('orders@example.com', 'Online Store');
$message->subject('Order Confirmation #123');
});
return response()->json(['status' => 'Order placed']);
}
}
?>
Результат выполнения кода:
{"status": "Order placed"}
Пример с использованием очереди в фоновом режиме
Запустим обработку очереди для отправки всех отложенных писем:
<?php
namespace AppConsole;
use IlluminateConsoleSchedulingSchedule;
use IlluminateFoundationConsoleKernel as ConsoleKernel;
class Kernel extends ConsoleKernel
{
protected function schedule(Schedule $schedule)
{
$schedule->command('queue:work')->everyMinute();
}
}
?>
Запустим обработчик очереди вручную из консоли:
"php artisan queue:work"