Метод with
Метод with применяется к объекту класса Mailable
и позволяет передать переменные в представление письма.
Метод принимает массив ключ-значение, где ключ - это имя
переменной в представлении, а значение - передаваемые данные.
Если передан массив с одним ключом, можно использовать
сокращённую запись. В представлении письма эти переменные
становятся доступны через стандартные конструкции Blade.
Синтаксис
<?php
use AppMailOrderShipped;
$mail = new OrderShipped($order);
$mail->with(['key' => 'value', 'another' => 'data']);
?>
Пример
Давайте создадим класс письма и передадим в него данные
о пользователе и заказе с помощью метода with:
<?php
namespace AppMail;
use IlluminateBusQueueable;
use IlluminateMailMailable;
use IlluminateMailMailablesContent;
use IlluminateQueueSerializesModels;
class OrderShipped extends Mailable
{
use Queueable, SerializesModels;
public function __construct(
public $order
) {}
public function envelope()
{
return new Envelope(
subject: 'Order Shipped',
);
}
public function content()
{
return new Content(
view: 'emails.orders.shipped',
);
}
public function attachments()
{
return [];
}
}
?>
Теперь отправим письмо и передадим дополнительные данные
через метод with в контроллере:
<?php
namespace AppHttpControllers;
use AppMailOrderShipped;
use AppModelsOrder;
use IlluminateSupportFacadesMail;
class OrderController extends Controller
{
public function ship(Order $order)
{
$orderData = [
'order_number' => $order->id,
'total' => $order->total,
];
Mail::to($order->user->email)
->send(new OrderShipped($order))
->with([
'orderData' => $orderData,
'userName' => $order->user->name,
]);
return redirect()->back()
->with('success', 'Order shipped successfully');
}
}
?>
В представлении письма мы можем использовать переданные
переменные $orderData и $userName:
<!DOCTYPE html>
<html>
<head>
<title>Order Shipped</title>
</head>
<body>
<h1>Hello, {{ $userName }}</h1>
<p>
Your order #{{ $orderData['order_number'] }}
has been shipped.
</p>
<p>
Total: ${{ $orderData['total'] }}
</p>
</body>
</html>
Результат выполнения кода в отправителе:
"Mail sent successfully to user@example.com"
Пример
Рассмотрим использование метода with с сокращённым
синтаксисом, когда передаётся одно значение:
<?php
namespace AppHttpControllers;
use AppMailOrderShipped;
use AppModelsOrder;
use IlluminateSupportFacadesMail;
class OrderController extends Controller
{
public function ship(Order $order)
{
$discount = $order->total * 0.1;
Mail::to($order->user->email)
->send(new OrderShipped($order))
->with('discount', $discount);
return redirect()->back()
->with('success', 'Order shipped successfully');
}
}
?>
В представлении теперь доступна переменная $discount:
<!DOCTYPE html>
<html>
<head>
<title>Order Shipped</title>
</head>
<body>
<h1>Hello, {{ $userName ?? 'Customer' }}</h1>
<p>
Your order #{{ $order->id }} has been shipped.
</p>
@if (isset($discount))
<p>
You received a discount of ${{ $discount }}!
</p>
@endif
</body>
</html>
Результат выполнения кода в отправителе:
"Mail sent successfully to user@example.com"