Удаление устроено проще, чем вывод. При этом оно включает в себя много нюансов. Вместо привычных GET и POST удаление делается запросом DELETE:
<?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. Если они видят обычную ссылку, то подразумевается, что она не может выполнить деструктивных действий, значит, ее можно посетить.
Мы можем работать в закрытой от поисковиков части сайта. Но в браузерах встроен механизм предзагрузки страниц, вызывающий ссылки, до которых сможет дотянуться на открытой странице. А плагины могут делать всё, что угодно.
Самостоятельная работа
- Реализуйте удаление пользователей.
Дополнительные материалы
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.