Ошибки, сложный материал, вопросы >
Нашли опечатку или неточность?

Выделите текст, нажмите ctrl + enter и отправьте его нам. В течение нескольких дней мы исправим ошибку или улучшим формулировку.

Что-то не получается или материал кажется сложным?

Загляните в раздел «Обсуждение»:

  • задайте вопрос нашим менторам. Вы быстрее справитесь с трудностями и прокачаете навык постановки правильных вопросов, что пригодится и в учёбе, и в работе программистом;
  • расскажите о своих впечатлениях. Если курс слишком сложный, подробный отзыв поможет нам сделать его лучше;
  • изучите вопросы других учеников и ответы на них. Это база знаний, которой можно и нужно пользоваться.
Об обучении на Хекслете

Обновление (CRUD)

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

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

Форма

Маршрут

<?php

Route::get('/articles/{id}/edit', 'ArticleController@edit')
  ->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}', 'ArticleController@update')
  ->name('articles.update');

Обработчик

<?php

use Illuminate\Http\Request;
use App\Article;

public function update(Request $request, $id)
{
    $article = Article::findOrFail($id);
    $data = $this->validate($request, [
        // У обновления немного изменённая валидация. В проверку уникальности добавляется название поля и 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.

<span class="translation_missing" title="translation missing: ru.web.courses.lessons.mentors.mentor_avatars">Mentor Avatars</span>

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

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

Для полного доступа к курсу нужна профессиональная подписка

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

Получить доступ
115
курсов
892
упражнения
2241
час теории
3196
тестов

Зарегистрироваться

или войти в аккаунт

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

  • 115 курсов, 2000+ часов теории
  • 800 практических заданий в браузере
  • 250 000 студентов

Нажимая кнопку «Зарегистрироваться», вы даёте своё согласие на обработку персональных данных в соответствии с «Политикой конфиденциальности» и соглашаетесь с «Условиями оказания услуг». Защита от спама reCAPTCHA «Конфиденциальность» и «Условия использования».

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

Логотип компании Альфа Банк
Логотип компании Rambler
Логотип компании Bookmate
Логотип компании Botmother

Есть вопрос или хотите участвовать в обсуждении?

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

Нажимая кнопку «Зарегистрироваться», вы даёте своё согласие на обработку персональных данных в соответствии с «Политикой конфиденциальности» и соглашаетесь с «Условиями оказания услуг». Защита от спама reCAPTCHA «Конфиденциальность» и «Условия использования».