Зарегистрируйтесь для доступа к 15+ бесплатным курсам по программированию с тренажером

CRUD: Удаление Веб-разработка на PHP

Удаление устроено даже проще чем вывод, но включает в себя много нюансов. Вместо привычных GET и POST удаление делается запросом DELETE. По спецификации HTTP этот глагол идемпотентный. Это означает, что поведение, в случае наличия или отсутствия сущности, должно быть одинаковое, другими словами HTTP-ответ этого обработчика не зависит от того удалена уже сущность или ещё нет.

CRUD Удаление

<?php

$router = $app->getRouteCollector()->getRouteParser();

$app->delete('/schools/{id}', function ($request, $response, array $args) use ($router) {
    $repo = new App\SchoolRepository();
    $id = $args['id'];
    $repo->destroy($id);
    $this->get('flash')->addMessage('success', 'School has been deleted');
    return $response->withRedirect($router->urlFor('schools'));
});

В процессе удаления есть и чисто интерфейсный момент, который начинающие разработчики упускают из виду. Кнопка удаления ни в коем случае не должна сразу удалять. Человеку свойственно ошибаться (а ещё он любопытен) и вероятность, что он нажмёт на эту кнопку по ошибке, крайне высока. Правильный подход состоит в том, чтобы спросить у пользователя, уверен ли он в том, что хочет удалить. Если да, то только в этом случае удалять.

А что насчёт безопасности? Удаление пользователя крайне опасная операция, которую нельзя выполнять всем подряд. Даже те, кто могут это делать, должны проходить через процедуру подтверждения, чтобы случайно не удалить пользователя. Имеет ли пользователь доступ к конкретным действиям определяется авторизацией.

Авториза́ция — предоставление определённому лицу или группе лиц прав на выполнение определённых действий; а также процесс проверки (подтверждения) данных прав при попытке выполнения этих действий. Авторизацию не следует путать с аутентификацией — процедурой проверки легальности пользователя или данных, например, проверки соответствия введённого пользователем пароля к учётной записи паролю Wiki.

То есть перед выполнением действия необходимо проверить авторизован ли пользователь на выполнение данного действия или нет. Авторизация, отдельная большая тема со своей теоретической базой. Как правило вопрос авторизации решается в каждом конкретном фреймворке самостоятельно, хотя на GitHub можно найти обобщённые библиотеки.

И последний вопрос который осталось рассмотреть — отправка запроса на удаление. Как вы помните, HTML-формы не поддерживают отправку методами, отличными от GET и POST. Фреймворки выкручиваются из этой ситуации следующим образом. Если в форме задать скрытое поле с именем _METHOD и значением того метода который нам нужен, то внутри фреймворка, до входа в обработчик, глагол будет заменён на тот, что был указан. Таким нехитрым способом фреймворки позволяют посылать любые запросы.

<form action="/users/<?= $user['id'] ?>" method="post">
  <input type="hidden" name="_METHOD" value="DELETE">
  <input type="submit" value="Remove">
</form>

Для включения этой возможности, нужно добавить немного конфигурации в Slim:

<?php

use Slim\Middleware\MethodOverrideMiddleware;

$app = AppFactory::create();
$app->add(MethodOverrideMiddleware::class);

Отдельно стоит сказать, что крайне важно соблюдать семантику HTTP. Ни в коем случае нельзя создавать HTML, в котором удаление происходит GET-запросом, например, по ссылке. Браузеры, их плагины и поисковые системы действуют в соответствии с семантикой HTTP. Если они видят обычную ссылку, то подразумевается что она не может выполнить деструктивных действий, а значит её можно посетить. Даже если мы работаем в закрытой от поисковиков части сайта, в браузерах встроен механизм предзагрузки страниц, который с удовольствием вызовет все ссылки до которых сможет дотянуться на открытой странице. А плагины могут делать вообще всё, что угодно.


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

  1. Реализуйте удаление пользователей.

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

  1. Библиотека для автоматизации фронтенд части (подстановка правильных глаголов, подтверждение)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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