old при редактировании записи в Laravel
При создании формы поля часто пустые.
При редактировании нужно сразу
показать текущие данные записи -
например, заголовок и текст поста
из базы. Если просто написать
$post->title в value,
после ошибки проверки и редиректа
назад ввод пользователя пропадёт.
Если только old('title') -
при первом открытии формы поля
будут пустыми.
Решение: вторым аргументом old
передать значение из модели. Тогда
при первом заходе форма заполнена
из БД, а после ошибки - тем, что
уже ввёл пользователь.
Маршрут редактирования:
<?php
Route::get('/post/{id}/edit', [PostController::class, 'edit']);
Route::post('/post/{id}/update', [PostController::class, 'update']);
?>
В контроллере находим пост и отдаём его в представление:
<?php
namespace App\Http\Controllers;
use App\Models\Post;
use Illuminate\Http\Request;
class PostController extends Controller
{
public function edit($id)
{
$post = Post::findOrFail($id);
return view('post.edit', ['post' => $post]);
}
public function update(Request $request, $id)
{
$post = Post::findOrFail($id);
if (!$request->filled('title')) {
return back()->withInput();
}
$post->title = $request->input('title');
$post->text = $request->input('text');
$post->save();
return redirect('/posts');
}
}
?>
В форме начальные данные берутся
из $post, а после ошибки -
из old:
<form method="POST" action="/post/{{ $post->id }}/update">
@csrf
<input
type="text"
name="title"
value="{{ old('title', $post->title) }}"
>
<textarea name="text">{{ old('text', $post->text) }}</textarea>
<button type="submit">save</button>
</form>
При первом открытии old('title')
пустой - в поле попадёт
$post->title. После редиректа
с withInput - то, что пользователь
уже отправил.
Сделайте редактирование поста:
маршрут, действие edit
и форму с old('title', $post->title).
В update при пустом title
вернитесь назад с withInput
и убедитесь, что ввод сохранился
в форме.