Laravel 9 - Выдаёт ошибку Undefined variable $reservations
Есть форма, при заполнении и отправки должно приходить на почту форма заполненых полей!
Но выдаёт ошибку
Undefined variable $reservations
всё перепробовал, но решения так и не нашёл.
Вот код в шаблоне письма
<tbody>
<tr>
<th colspan="2">
<h3>Passenger information</h3>
</th>
</tr>
<tr class="green">
<td>Имя:</td>
<td>{{$reservations->name}}</td>
</tr>
<tr>
<td>Телефон:</td>
<td>{{$reservations->phone}}</td>
</tr>
<tr class="green">
<td>E-mail:</td>
<td>{{$reservations->email}}</td>
</tr>
<tr class="green">
<td>Repeat email:</td>
<td>{{$reservations->email_repeat}}</td>
</tr>
</tbody>
</table>
Это код в контроллере
public function StoreReservation(Request $request) {
Reservation::insert([
'name' => $request -> name,
'phone' => $request -> tel,
'email' => $request -> email,
'email_repeat' => $request -> email_repeat,
'created_at' => Carbon::now(),
]);
$notification = array(
'message' => 'Your Reservation Submited Seccessfully',
'alert-type' => 'success'
);
$to_name = 'Reservation';
$to_email = '[email protected]';
$reservations = array("name"=>"reservationa2", "body"=>"test mail");
Mail::send('mail', $reservations, function ($message) use ($to_email) {
$message->from("[email protected]", 'username');
$message->to($to_email)->subject('laravel reservation');
});
return redirect()->back()->with($notification);
}
Ответы (1 шт):
Ошибка, абсолютно верная - шаблон действительно не видит данную переменную, потому что вы её неправильно передали.
Во втором параметре передаётся не одна переменная, а ассоциативный массив в котором
- ключами будут названия переменных, которые будут доступны в шаблоне,
- а в значениях - их значения соответственно
Названия переменных в контроллере могут отличаться, от соответствующих переменных в шаблоне. Их названия передаются в ключах, после чего перед рендером шаблона письма вызывается функция extract() в которую передается тот самый массив, и данная функция извлекает значения в переменные с названиями, указанными в ключах.
https://www.php.net/manual/ru/function.extract.php
Другими словами вам нужно было передавать
не $reservations,
а ['reservations' => $reservations]
Попробуйте так:
// создаем переменную, описывающий контекст письма
// содержащую массив с переменными, доступными в шаблоне
$params = [
'reservations' => $reservations
];
// передаем их вторым параметром.
Mail::send('mail', $params, function ($message) use ($to_email) {
$message->from("[email protected]", 'username');
$message->to($to_email)->subject('laravel reservation');
});
Подробнее в документации:
https://laravel.su/docs/5.0/mail
Это еще не конец
На этом все не закончится ибо у вас есть еще одна ошибка
Смотрим Шаблон:
<tbody>
<tr>
<th colspan="2">
<h3>Passenger information</h3>
</th>
</tr>
<tr class="green">
<td>Имя:</td>
<td>{{$reservations->name}}</td>
</tr>
<tr>
<td>Телефон:</td>
<td>{{$reservations->phone}}</td>
</tr>
<tr class="green">
<td>E-mail:</td>
<td>{{$reservations->email}}</td>
</tr>
<tr class="green">
<td>Repeat email:</td>
<td>{{$reservations->email_repeat}}</td>
</tr>
</tbody>
</table>
А теперь смотрим переменную, которую вы передали
$reservations = array("name"=>"reservationa2", "body"=>"test mail");
Шаблон ожидает объект Reservation, а вы ему передаете массив ["name"=>"reservationa2", "body"=>"test mail"]
И после того как он попадет в шаблон будет еще одна ошибка,
- потому что это будет не объект, а массив
- и потому что у него не будет нужных полей.
Вам стоит сохранить результат вставки в переменную
$reservation = Reservation::insert([
'name' => $request -> name,
'phone' => $request -> tel,
'email' => $request -> email,
'email_repeat' => $request -> email_repeat,
'created_at' => Carbon::now(),
]);
и уже его передавать в шаблон
Итого
public function StoreReservation(Request $request) {
$reservation = Reservation::insert([
'name' => $request -> name,
'phone' => $request -> tel,
'email' => $request -> email,
'email_repeat' => $request -> email_repeat,
'created_at' => Carbon::now(),
]);
$notification = array(
'message' => 'Your Reservation Submited Seccessfully',
'alert-type' => 'success'
);
$to_name = 'Reservation';
$to_email = '[email protected]';
// создаем переменную, описывающий контекст письма
// содержащую массив с переменными, доступными в шаблоне
$params = [
'reservations' => $reservation
];
// передаем их вторым параметром.
Mail::send('mail', $params, function ($message) use ($to_email) {
$message->from("[email protected]", 'username');
$message->to($to_email)->subject('laravel reservation');
});
return redirect()->back()->with($notification);
}