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