Чат веб-разработчиков
Создание записей в блоге на PHP

Добавляем статьи в блог на PHP

В этом уроке мы с вами добавим самый главный функционал блога – добавление новых записей.

В одном из прошлых уроков мы уже добавили роут /articles/add и соответствующий экшен ArticlesController->add(). Так он выглядит сейчас:

src/MyProject/Controllers/ArticlesController.php

Код доступен только после покупки курса ООП в PHP.

Теперь давайте сделаем форму, которую можно будет заполнить в браузере и создавать через неё новые записи.

templates/articles/add.php

Код доступен только после покупки курса ООП в PHP.

Теперь сделаем набросок для контроллера, чтобы просто увидеть нашу форму.

src/MyProject/Controllers/ArticlesController.php

Код доступен только после покупки курса ООП в PHP.

Посмотрим на результат:
Форма добавления статей

Итак, в форме у нас есть 2 поля: name и text. На их основе мы должны научиться создавать статьи. Кроме того, в контроллере у нас также есть свойство user – текущий пользователь. Его нужно будет указывать автором при создании статей. Если мы соберем все эти три значения – мы сможем создать статью.

Первым делом нужно убедиться, что пользователь авторизован. Если это не так – будем кидать исключение в контроллере и ловить его во фронт-контроллере. Назовём такое исключение UnauthorizedException.

src/MyProject/Exceptions/UnauthorizedException.php

Код доступен только после покупки курса ООП в PHP.

Добавляем проверку в самом начале экшена.

src/MyProject/Controllers/ArticlesController.php

Код доступен только после покупки курса ООП в PHP.

Обрабатываем исключение во фронт-контроллере. Добавляем в конце еще один catch.

www/index.php

Код доступен только после покупки курса ООП в PHP.

И, наконец, добавляем шаблон для ошибки.

templates/errors/401.php

Код доступен только после покупки курса ООП в PHP.

Разлогиниваемся на сайте и проверяем, что ошибка действительно появляется.
Незалогиненный пользователь не может создавать статьи

Затем входим на сайт и видим, что ошибка пропала и нам снова доступна форма для создания статьи.
Добавление статьи доступно

Теперь можно создать в модели статьи метод для создания новой статьи.

src/MyProject/Models/Articles/Article.php

Код доступен только после покупки курса ООП в PHP.

Дописываем экшен:

src/MyProject/Controllers/ArticlesController.php

Код доступен только после покупки курса ООП в PHP.

Здесь мы пытаемся создать новую статью, и если возникают ошибки – то мы показываем их в шаблоне. Если же все проходит хорошо – то мы переадресовываем пользователя на страничку с новой статьёй. Давайте теперь попробуем.

Заполняем формочку по адресу http://myproject.loc/articles/add
Создание статьи

И вуаля – создалась новая статья.

Созданная статья

А теперь – за домашку.

Читайте также
Комментарии


Kirill.K
Kirill.K

ArticlesController:

...
if ($this->user->getRole() !== admin) {
            throw new Forbidden();
        }
...

Templates\errors\403:

<?php include __DIR__ . '/../header.php'; ?>
    <h1>Для добавления статьи нужно обладать правами администратора</h1>
<?php include __DIR__ . '/../footer.php'; ?>

Index:

catch (\MyProject\Exceptions\Forbidden $e) {
    $view = new \MyProject\View\View(__DIR__ . '/../templates/errors');
    $view->renderHtml('403.php', ['error' => $e->getMessage()], 403);
}
ivashkevich
ivashkevich

Хорошо, но в Templates\errors\403 стоит выводить переменную error в шаблоне, а не хардкодить текст ошибки.

А для проверки того, является ли юзер админом можно создать в модели User метод isAdmin, который будет это проверять:

if(!$user->isAdmin()) {
...
Kirill.K
Kirill.K

Так?:
User:

 public function isAdmin(): bool
    {
        return $this->role === admin;
    }

ArticlesController:

if(!$this->user->isAdmin()) {
            throw new Forbidden('Для добавления статьи нужно обладать правами администратора');
        }

Templates\errors\403:

<?php include __DIR__ . '/../header.php'; ?>
<?= $error ?>
<?php include __DIR__ . '/../footer.php'; ?>
Kirill.K
Kirill.K

Ещё хотел спросить - при отображении ошибки наша шапка с ником юзера слетает. Куки живы, но отсутствует объект $user, от наличия которого у нас зависит вывод. Как бы это исправить, не могу додуматься?

ivashkevich
ivashkevich

На странице с ошибкой не нужны данные о пользователе. Ошибка - это ошибка, больше ничего быть там не должно.

Kirill.K
Kirill.K

Хорошо) Но тогда нужно сделать отдельный HeaderForErrors:

<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <title>Мой блог</title>
    <link rel="stylesheet" href="/styles.css">
</head>
<body>

<table class="layout">
    <tr>
        <td colspan="2" class="header">
            Мой блог
        </td>
    </tr>
    <tr>
        <td>

А то наш базовый предлагает войти или зарегистрироваться при выводе ошибки

ivashkevich
ivashkevich

Да, можно так.