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

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

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

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

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

Удаление (CRUD)

Удаление – самое простое действие в обычном CRUD. Ему не нужен шаблон, все удаление состоит из простого обработчика, в котором даже нет условных конструкций.

Маршрут:

<?php

Route::delete('/articles/{id}', 'ArticleController@destroy')
  ->name('articles.destroy');

Обработчик:

<?php

// Не забывайте про авторизацию (здесь не рассматривается)
// Удаление должно быть доступно только тем, кто может его выполнять
public function destroy($id)
{
    // DELETE — идемпотентный метод, поэтому результат операции всегда один и тот же
    $article = Article::find($id);
    if ($article) {
      $article->delete();
    }
    return redirect()->route('articles.index');
}

Самое интересное в удаление – это ссылка или кнопка удаления. Она не может быть обычной ссылкой. Почему? Потому что, с точки зрения HTTP, удаление это DELETE-запрос. Эту семантику важно соблюдать, так как на неё ориентируются разные инструменты и поисковики при анализе страниц. Если сделать удаление обычной ссылкой, то любой автоматический инструмент может попробовать перейти по ней (например предзагрузка страниц в chrome). Это будет крайне неприятный сюрприз.

Как минимум для разрешения подобных ситуаций нужно использовать аттрибут rel:

<a href="..." rel="nofollow">Удалить</a>

Но этого недостаточно для отправки DELETE-запроса. Правильно реализовать эту ссылку формой, которая не отправляет никаких данных, но шлёт верный запрос. В принципе так и можно поступить, но возникает странная ситуация. Само удаление содержит меньше кода чем кнопка по удалению. Да и шаблоны становятся очень грязными.

Избежать ручного создания такой формы можно с помощью библиотеки jquery-ujs, которая изначально была написана для Rails, но не ограничена этим фреймворком. Эта библиотека написана на JS и подключается во фронтенд-части. Она опирается на data-атрибуты и сама превращает в форму все что её попросят. Для её установки, наберите в директории проекта:

# Убедитесь в том, что у вас установлена Node.js
$ node -v
v13.7.0 # Ваша версия может отличаться

# Установите зависимости
$ npm install @rails/ujs
# Для установки остальных пакетов
$ npm install

Затем добавьте в конец файла resources/js/app.js строчки:

const ujs = require('@rails/ujs');
ujs.start();

И запустите сборку фронтенда:

$ npm run watch

Теперь попробуем использовать эту библиотеку:

<a href="..." data-method="delete" rel="nofollow">Удалить</a>

Библиотека подключённая к странице, проанализирует все ссылки с нужными data-атрибутами и превратит их в формы отправляющие указанные запросы. Эти запросы могут быть любыми, хоть DELETE, хоть PATCH.

Кроме того, с её помощью можно блокировать кнопки и вызывать подтверждение:

<a href="..." data-confirm="Вы уверены?" data-method="delete" rel="nofollow">Удалить</a>

<input type="submit" value="Сохранить" data-disable-with="Сохраняем">

Зависимости

В реальной жизни удаление не такая простая операция. Обычно сущности не существуют сами по себе, у них есть зависимости. Например, у статьи есть комментарии, а у курса — уроки. Как должна вести себя система при удалении родительской сущности? Что делать с зависимостями?

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

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

  1. Реализуйте удаление
  2. Добавьте в список статей ссылку на удаление каждой статьи.
  3. Попробуйте самостоятельно добавить вывод флеш-сообщений.

Дополнительные материалы

  1. Работа с фронтендом в Laravel
  2. Мягкое удаление

<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 «Конфиденциальность» и «Условия использования».