Обновление данных

Шаг 1: Создание страниц

Сначала надо указать две страницы, один для вывода формы редактирования, и вторую, где будет происходить само обновление странцы.

// routes/web.php
use App\Http\Controllers\PageController;

Route::get('/pages/{id}/edit', [PageController::class, 'edit']);
Route::put('/pages/{id}', [PageController::class, 'update']);

Данные способы указаны в документации Laravel.

Данные страницы сейчас может открыть любой пользователь. Указать, чтобы они были доступны только авторизованным, можно через код ниже:

// routes/web.php
Route::get('/pages/{id}/edit', [PageController::class, 'edit'])->middleware('auth');
Route::put('/pages/{id}', [PageController::class, 'update'])->middleware('auth');

Также  стоит обратить внимание, что для обновления страницы задан тип запроса «PUT».

Шаг 2: Создание страницы редактирования

В файле контроллера надо указать шаблон, в котором будет выводиться страница редактирования.

// app/Http/Controllers/PageController.php
use Illuminate\View\View;

class PageController extends Controller
{
    public function edit($id): View
    {
        // выбираем данные страницы, иначе показываем 404
        $page = Page::where(['id' => $id])->firstOrFail();
        return view('pages.edit', ['page' => $page]);
    }
}

В методе view() указано, что надо вывести шаблон из файла «resources/views/pages/edit.blade.php».

Теперь надо вывести саму форму:

<!-- resources/views/layouts/edit.blade.php -->
@section('title', 'Изменение страницы')

<x-app-layout>
    <form method="post" action="/pages/{{ $page->id }}">
        @method('PUT')
        @csrf

        <input type="text" name="title" value="{{ $post->title }}">
    </form>
</x-app-layout>

В теге <form> внутри атрибута «action» указана ссылка, на которой будет обновляться страница.

Если ссылка поменяется, то форма будет ввести на неактуальную страницу. В этом случае для ссылки обновления стоит дать имя.

// routes/web.php
Route::put('/pages/{id}', [PageController::class, 'update'])->name('page-update');

И указать её в форме:

<!-- resources/views/layouts/edit.blade.php -->
<form method="post" action="{{ route('page-update', [$page->id]) }}">
    @method('PUT')
    @csrf

    <input type="text" name="title" value="{{ $post->title }}">
</form>

Также стоит обратить внимание, что для формы заданы @method('PUT') и @csrf.

Первая задаёт для формы тип запроса «PUT», а вторая предотвращает CSRF-атаку.

Шаг 3: Сохранение данных

Теперь при отправки данных с формы, её надо сохранить в базе данных. Делается это через код ниже:

// app/Http/Controllers/PageController.php
use Illuminate\Http\{Request, RedirectResponse};
use Illuminate\Support\Facades\Redirect;

class PageController extends Controller
{
    public function update($id, Request $request): RedirectResponse
    {
        $page = Page::where(['id' => $id])->first(); 
        $page->title = $request->post('title'); 
        $page->content = $request->post('content');
        $page->save(); 
        
        $request->session()->flash('success', 'Страница успешно обновлена');
        return Redirect::route('page-edit', [$id]);
    }
}