Запит Livewire - не звичайний запит сторінки, а AJAX. HTTP-редирект у відповідь на нього браузер не виконає як перехід. Тому Livewire передає «команду перейти» в JavaScript, а той змінює сторінку.
Методи компонента:
public function save(): void
{
$post = $this->form->save();
session()->flash('status', 'Пост опубліковано');
$this->redirectRoute('posts.show', ['post' => $post]);
}
$this->redirect('/posts')- за адресою;$this->redirectRoute('posts.show', [...])- за назвою маршруту;$this->redirectAction([PostController::class, 'index'])- на дію контролера;$this->redirectIntended('/dashboard')- туди, куди користувач ішов до входу.
Повернути redirect()->route(...) з методу теж можна - Livewire розпізнає звичайну відповідь-редирект Laravel.
SPA-перехід замість повного завантаження:
$this->redirect('/posts', navigate: true);
$this->redirectRoute('posts.index', navigate: true);
Сторінка підвантажується як при wire:navigate: без перезавантаження скриптів і стилів, швидше.
Флеш-повідомлення працюють, як у звичайному Laravel, - session()->flash(), а на сторінці призначення:
@if (session('status'))
<div class="alert">{{ session('status') }}</div>
@endif
Повідомлення без редиректу. Якщо після збереження користувач лишається на тій самій сторінці, флеш-повідомлення з'явиться лише при наступному запиті - не одразу. Тут краще:
- подія в браузер, яку слухає компонент сповіщень (
$this->dispatch('notify', message: 'Збережено')); - властивість компонента з текстом повідомлення.
Пастки:
- код після редиректу виконується:
$this->redirect()лише записує намір, а не зупиняє метод. Якщо після нього є ще логіка, вона спрацює - за потреби додайтеreturn; - редирект на зовнішній домен з
navigate: trueне працює як SPA-перехід - для зовнішніх адрес звичайнийredirect(); - не редиректити за адресою з введення користувача без перевірки - відкритий редирект використовують для фішингу.