Обновление очень похоже на создание, с той лишь разницей, что мы не создаем сущность с нуля, а извлекаем ее из базы. Остальное практически без изменений.
За скобками остается важный вопрос: права на изменение. Изменять что-то на сайте, обычно, может только автор, тот кто создал сущность. Механизм, который отвечает за выдачу и проверку прав, называется авторизацией (не путать с аутентификацией). В Laravel авторизация встроена. Она не рассматривается в курсе, но про нее можно прочитать самостоятельно в документации.
Форма
Маршрут
<?php
Route::get('articles/{id}/edit', [ArticleController::class, 'edit'])
->name('articles.edit');
Обработчик
<?php
use App\Models\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
{{ html()->label('Имя', 'name') }}
{{ html()->input('text', 'name') }}
{{ html()->label('Содержание', 'body') }}
{{ html()->textarea('body') }}
Теперь включите его в create.blade.php:
{{ html()->modelForm($article, 'POST', route('articles.store'))->open() }}
@include('article.form')
{{ html()->submit('Создать') }}
{{ html()->closeModelForm() }}
И практически то же самое надо добавить в edit.blade.php. Создайте этот файл и вставьте в него код:
<?php
{{ html()->modelForm($article, 'PATCH', route('articles.update', $article))->open() }}
@include('article.form')
{{ html()->submit('Обновить')->class('btn btn-primary') }}
{{ html()->closeModelForm() }}
Основных изменений здесь три:
- Другое имя кнопки
- Метод отправки PATCH, так как происходит обновление
- Адрес формы указывает на конкретную статью
Обработчик формы
Маршрут
<?php
// Метод PATCH
Route::patch('articles/{id}', [ArticleController::class, 'update'])
->name('articles.update');
Обработчик
<?php
use Illuminate\Http\Request;
use App\Models\Article;
public function update(Request $request, $id)
{
$article = Article::findOrFail($id);
$data = $request->validate([
// У обновления немного измененная валидация
// В проверку уникальности добавляется название поля и id текущего объекта
// Если этого не сделать, Laravel будет ругаться, что имя уже существует
'name' => "required|unique:articles,name,{$article->id}",
'body' => 'required|min:100',
]);
$article->fill($data);
$article->save();
return redirect()
->route('articles.index');
}
Обработчик, обновляющий сущность практически идентичен созданию сущности. Разница кроется в нескольких деталях. Во-первых, мы работаем с существующей статьей, поэтому ее нужно извлечь из базы данных. Во-вторых, валидация на уникальность должна учитывать текущую статью при проверке. Иначе валидатор будет ругаться, что такое имя уже есть в базе данных.
Можно заметить, что валидации повторяются практически один в один. Так происходит в подавляющем большинстве случаев. Те правила, которые применяются к сущности при создании, должны применяться к ней и во время редактирования. При текущем подходе возникает дублирование, которого хотелось бы избежать. Это можно сделать с помощью Form Request.
В остальном все то же самое: объект заполняется значениями из формы, далее сохранение и редирект на список статей.
Самостоятельная работа
- Выполните все шаги из теории.
- Добавьте в список статей ссылку на редактирование каждой статьи.
- Обновите через интерфейс несколько статей. Проверьте работу валидации.
- Попробуйте самостоятельно добавить вывод флеш-сообщений.
- Попробуйте самостоятельно добавить Form Request.
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.