В КУРСЕ?

Разбираемся в теме

Блог на Laravel: публикации, права доступа и безопасное хранение

Создание блога на Laravel удобно начинать с жизненного цикла статьи: автор сохраняет черновик, редактор публикует материал, читатель открывает доступную запись. Эта последовательность определяет структуру данных и проверки доступа. Если сначала продумать её, формы и шаблоны станут понятным интерфейсом к правилам приложения.

Модель статьи и устойчивый адрес

Для модели Post предусмотрите заголовок, slug, текст, идентификатор автора, статус и время публикации. Миграция описывает таблицу и ограничения; уникальный индекс для slug защищает от совпадающих адресов даже при одновременном сохранении. Slug представляет статью в адресной строке, но не заменяет внутренний идентификатор. После публикации его лучше сохранять стабильным, а при изменении отдельно организовать перенаправление. Автор связывается со статьями отношением один ко многим. Публикацию считайте доступной, только когда статус разрешает показ и время публикации уже наступило. Один лишь заполненный текст ничего не говорит о готовности материала.

Маршруты, контроллеры и полномочия

Разделите публичный просмотр и редакторские действия. GET-запрос списка направляется в index, просмотр статьи — в show, создание записи — в store через POST, обновление — в update через PATCH. Контроллер координирует запрос к модели и выбор представления. Middleware аутентификации устанавливает, кто вошёл, а PostPolicy определяет, может ли этот человек редактировать конкретную запись. Проверка нужна при каждом изменяющем запросе: скрытая кнопка не защищает данные. Привязка модели по slug лишь находит статью. В публичном просмотре дополнительно ограничьте выборку опубликованными записями, возвращая для недоступного черновика ответ 404. Список и поиск должны применять такое же условие.

Проверка формы и сохранение текста

Form Request позволяет собрать правила валидации и авторизации запроса в отдельном классе. Например, заголовок обязателен и ограничен 180 символами, текст не пустой, slug соответствует выбранному формату. В модель передавайте только разрешённые проверенные поля. Идентификатор автора задавайте на сервере по текущему пользователю; право менять статус публикации проверяйте отдельно. Валидация не заменяет ограничений базы данных. Для форм сохраняйте защиту от подделки запросов. Обычный вывод Blade экранирует текст; отключать экранирование для произвольного содержимого опасно. Если нужен редактор с форматированием, заранее предусмотрите очистку HTML по ограниченному набору разрешённых элементов.

Обложки и постраничная выдача

У загрузки обложки проверяйте допустимый тип содержимого и размер, а имя файла формируйте на сервере. Сохраняйте файл через настроенное хранилище Laravel, записывая в базу его путь. Изображение черновика не должно становиться доступным только потому, что файл положили на публичный диск: для закрытых вложений требуется закрытое хранение и проверяемая выдача. В ленте применяйте paginate к запросу уже отфильтрованных публикаций, а не загружайте всю таблицу. Задайте порядок по времени публикации и идентификатору, чтобы записи с одинаковым временем имели определённую последовательность. Размер страницы ограничьте разумной фиксированной величиной.

Попробуйте на практике

Спроектируйте небольшой блог в текстовом редакторе. Установка сервера и регистрация не нужны: подготовьте схему, по которой затем можно написать приложение и тесты.

  1. Опишите поля Post и создайте три вымышленные записи: черновик, опубликованную статью и материал с будущим временем публикации.
  2. Запишите действия index, show, store и update. Для каждого укажите метод запроса и доступные роли: гость, автор, редактор.
  3. Добавьте правила заголовка, уникальности slug, назначения автора и хранения закрытой обложки.
  4. Составьте ожидаемые результаты шести проверок: пустой заголовок, повторный slug, чужое редактирование, прямое открытие черновика, будущая публикация и обычный публичный просмотр.

Как проверить результат. План готов, если гостю доступна только опубликованная статья, чужое редактирование отклоняется, ошибочные данные не сохраняются, а закрытая обложка защищена отдельно от страницы.

Частые вопросы

Нужен ли отдельный API для первого блога?

Нет. Серверные страницы с Blade подходят для списка, статьи и редакторских форм. API добавляют, когда появляется конкретный клиент или сценарий обмена данными.

Почему проверки slug в форме недостаточно?

Два запроса могут одновременно пройти проверку. Уникальное ограничение базы остаётся последним барьером; конфликт сохранения нужно обработать понятным сообщением.

Самостоятельный разбор темы. Содержание конкретной обучающей программы здесь не представлено.

Зарегистрируйтесь, чтобы уточнить возможность доступа к этому материалу

Зарегистрироваться
← К списку материалов