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

Обновление очень похоже на создание, с той лишь разницей, что мы не создаем сущность с нуля, а извлекаем ее из базы. Остальное практически без изменений.

За скобками остается важный вопрос: права на изменение. Изменять что-то на сайте, обычно, может только автор, тот кто создал сущность. Механизм который отвечает за выдачу и проверку прав, называется авторизацией (не путать с аутентификацией). В Laravel авторизация встроена. Она не рассматривается в курсе, но про нее можно прочитать самостоятельно в документации.

Форма

Маршрут

<?php

Route::get('/articles/{id}/edit', '[email protected]')
  ->name('articles.edit');

Обработчик

<?php

use App\Article

public function edit($id)
{
    $article = Article::findOrFail($id);
    return view('article.edit', compact('article'));
}

Шаблон

Шаблон редактирования практически один в один повторяет шаблон создания. Разными у них бывают только отдельные элементы, например текст кнопки отправки формы. Для таких случаев используют директиву @include($pathToTemplate), которая позволяет извлекать общие куски шаблонов в отдельные шаблоны и включать их там где нужно.

Создайте в директории resources/views/article шаблон form.blade.php.

@if ($errors->any())
    <div>
        <ul>
            @foreach ($errors->all() as $error)
                <li>{{ $error }}</li>
            @endforeach
        </ul>
    </div>
@endif

{{ Form::label('name', 'Название') }}
{{ Form::text('name') }}<br>
{{ Form::label('body', 'Содержание') }}
{{ Form::textarea('body') }}<br>

Теперь включите его в create.blade.php:

{{ Form::model($article, ['url' => route('articles.store')]) }}
    @include('article.form')
    {{ Form::submit('Сохранить') }}
{{ Form::close() }}

И практически тоже самое надо добавить в edit.blade.php. Создайте этот файл и вставьте в него код:

<?php

{{ Form::model($article, ['url' => route('articles.update', $article), 'method' => 'PATCH']) }}
    @include('article.form')
    {{ Form::submit('Обновить') }}
{{ Form::close() }}

Основных изменений здесь три:

  • Другое имя кнопки
  • Метод отправки PATCH, так как происходит обновление
  • Адрес формы указывает на конкретную статью

Обработчик формы

Маршрут

<?php

// Метод PATCH
Route::patch('/articles/{id}', '[email protected]')
  ->name('articles.update');

Обработчик

<?php

use Illuminate\Http\Request;
use App\Article

public function update(Request $request, $id)
{
    $article = Article::findOrFail($id);
    $this->validate($request, [
        // У обновления немного измененная валидация. В проверку уникальности добавляется название поля и id текущего объекта
        // Если этого не сделать, Laravel будет ругаться на то что имя уже существует
        'name' => 'required|unique:articles,name,' . $article->id,
        'body' => 'required|min:100',
    ]);

    $article->fill($request->all());
    $article->save();
    return redirect()
        ->route('articles.index');
}

Обработчик обновляющий сущность практически идентичен созданию сущности. Разница кроется в нескольких деталях. Во-первых мы работаем с существующей статьей, поэтому ее нужно извлечь из базы данных. Во-вторых, валидация на уникальность должна учитывать текущую статью при проверке. Иначе валидатор будет ругаться, что такое имя уже есть в базе данных.

Можно заметить, что валидации повторяются практически один в один. Так происходит в подавляющем большинстве случаев. Те правила которые применяются к сущности при создании, должны применяться к ней и во время редактирования. При текущем подходе возникает дублирование, которого хотелось бы избежать. Это можно сделать с помощью Form Request.

В остальном все тоже самое: объект заполняется значениями из формы, далее сохранение и редирект на список статей.

Самостоятельная работа

  1. Выполните все шаги из теории.
  2. Добавьте в список статьей ссылку на редактирование каждой статьи.
  3. Обновите через интерфейс несколько статей. Проверьте работу валидации.
  4. Попробуйте самостоятельно добавить вывод флеш сообщений.
  5. Попробуйте самостоятельно добавить Form Request.
Мы учим программированию с нуля до стажировки и работы. Попробуйте наш бесплатный курс «Введение в программирование» или полные программы обучения по Node, PHP, Python и Java.

Хекслет

Подробнее о том, почему наше обучение работает →