Зарегистрируйтесь, чтобы продолжить обучение

Обновление (CRUD) PHP: Разработка на Laravel

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

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

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


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

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

Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты

Для полного доступа к курсу нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
1000
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff
Рекомендуемые программы
профессия
Программирование на PHP, Разработка веб-приложений и сервисов используя Laravel, проектирование и реализация REST API
10 месяцев
с нуля
Старт 26 декабря

Используйте Хекслет по-максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»