Модель статьи и устойчивый адрес
Для модели Post предусмотрите заголовок, slug, текст, идентификатор автора, статус и время публикации. Миграция описывает таблицу и ограничения; уникальный индекс для slug защищает от совпадающих адресов даже при одновременном сохранении. Slug представляет статью в адресной строке, но не заменяет внутренний идентификатор. После публикации его лучше сохранять стабильным, а при изменении отдельно организовать перенаправление. Автор связывается со статьями отношением один ко многим. Публикацию считайте доступной, только когда статус разрешает показ и время публикации уже наступило. Один лишь заполненный текст ничего не говорит о готовности материала.
Маршруты, контроллеры и полномочия
Разделите публичный просмотр и редакторские действия. GET-запрос списка направляется в index, просмотр статьи — в show, создание записи — в store через POST, обновление — в update через PATCH. Контроллер координирует запрос к модели и выбор представления. Middleware аутентификации устанавливает, кто вошёл, а PostPolicy определяет, может ли этот человек редактировать конкретную запись. Проверка нужна при каждом изменяющем запросе: скрытая кнопка не защищает данные. Привязка модели по slug лишь находит статью. В публичном просмотре дополнительно ограничьте выборку опубликованными записями, возвращая для недоступного черновика ответ 404. Список и поиск должны применять такое же условие.
Проверка формы и сохранение текста
Form Request позволяет собрать правила валидации и авторизации запроса в отдельном классе. Например, заголовок обязателен и ограничен 180 символами, текст не пустой, slug соответствует выбранному формату. В модель передавайте только разрешённые проверенные поля. Идентификатор автора задавайте на сервере по текущему пользователю; право менять статус публикации проверяйте отдельно. Валидация не заменяет ограничений базы данных. Для форм сохраняйте защиту от подделки запросов. Обычный вывод Blade экранирует текст; отключать экранирование для произвольного содержимого опасно. Если нужен редактор с форматированием, заранее предусмотрите очистку HTML по ограниченному набору разрешённых элементов.
Обложки и постраничная выдача
У загрузки обложки проверяйте допустимый тип содержимого и размер, а имя файла формируйте на сервере. Сохраняйте файл через настроенное хранилище Laravel, записывая в базу его путь. Изображение черновика не должно становиться доступным только потому, что файл положили на публичный диск: для закрытых вложений требуется закрытое хранение и проверяемая выдача. В ленте применяйте paginate к запросу уже отфильтрованных публикаций, а не загружайте всю таблицу. Задайте порядок по времени публикации и идентификатору, чтобы записи с одинаковым временем имели определённую последовательность. Размер страницы ограничьте разумной фиксированной величиной.
Попробуйте на практике
Спроектируйте небольшой блог в текстовом редакторе. Установка сервера и регистрация не нужны: подготовьте схему, по которой затем можно написать приложение и тесты.
- Опишите поля Post и создайте три вымышленные записи: черновик, опубликованную статью и материал с будущим временем публикации.
- Запишите действия index, show, store и update. Для каждого укажите метод запроса и доступные роли: гость, автор, редактор.
- Добавьте правила заголовка, уникальности slug, назначения автора и хранения закрытой обложки.
- Составьте ожидаемые результаты шести проверок: пустой заголовок, повторный slug, чужое редактирование, прямое открытие черновика, будущая публикация и обычный публичный просмотр.
Как проверить результат. План готов, если гостю доступна только опубликованная статья, чужое редактирование отклоняется, ошибочные данные не сохраняются, а закрытая обложка защищена отдельно от страницы.
Частые вопросы
Нужен ли отдельный API для первого блога?
Нет. Серверные страницы с Blade подходят для списка, статьи и редакторских форм. API добавляют, когда появляется конкретный клиент или сценарий обмена данными.
Почему проверки slug в форме недостаточно?
Два запроса могут одновременно пройти проверку. Уникальное ограничение базы остаётся последним барьером; конфликт сохранения нужно обработать понятным сообщением.
Самостоятельный разбор темы. Содержание конкретной обучающей программы здесь не представлено.