Редирект на предыдущую страницу в Laravel
Часто после обработки запроса нужно вернуть пользователя туда, откуда он пришёл. Удобный пример - удаление: пользователь смотрит список постов (или страницу одного поста), жмёт ссылку «удалить», сервер удаляет запись и сразу отправляет его обратно на ту же страницу, а не на какой-то жёстко прописанный URL.
«Назад» здесь - это не кнопка браузера
и не адрес вроде /posts,
зашитый в код. Laravel берёт URL
предыдущей страницы из заголовка
Referer (или из сессии) -
то есть ту страницу, с которой
пользователь перешёл по ссылке
удаления. Если он был на списке -
вернётся на список; если на карточке
поста - на карточку (или туда,
откуда реально пришёл запрос).
Так одно и то же действие удаления может вызываться с разных страниц и всегда вернёт пользователя туда, откуда он пришёл.
Пусть в списке постов есть ссылка на удаление:
@foreach ($posts as $post)
<div>
{{ $post->title }}
<a href="/post/{{ $post->id }}/delete">
delete
</a>
</div>
@endforeach
Маршрут:
<?php
Route::get('/post/{id}/delete', [PostController::class, 'destroy']);
?>
В контроллере удаляем пост и делаем редирект назад:
<?php
namespace App\Http\Controllers;
use App\Models\Post;
class PostController extends Controller
{
public function destroy($id)
{
$post = Post::findOrFail($id);
$post->delete();
return redirect()->back();
}
}
?>
Существует короткий вариант через хелпер:
<?php
namespace App\Http\Controllers;
use App\Models\Post;
class PostController extends Controller
{
public function destroy($id)
{
$post = Post::findOrFail($id);
$post->delete();
return back(); // короткий вариант
}
}
?>
Оба варианта делают одно и то же: после удаления отправляют пользователя на предыдущую страницу.
Сделайте список постов со ссылкой
удаления у каждого. По ссылке
удалите пост и верните пользователя
назад через redirect()->back().
Перепишите тот же редирект
через хелпер back().