Laravel 13 и PHP: портал «Заявка»
«Заявка» — портал вымышленных обращений сотрудников. Один проект развивается от маршрута и Blade до схемы, Eloquent, сессионного входа, policy, форм, комментариев, атомарного закрытия, страниц списка, очереди, database notifications, частного PDF и JSON-ресурса. Запись получает владельца из сессии, а не из внешнего user_id.
Предпосылки: классы и массивы PHP, Composer, HTTP, базовое понимание SQL. Профиль документации на 11 октября 2026 года: PHP 8.4.25, laravel/framework 13.35.0; официальный каркас laravel/laravel v13.0.0. Laravel 13 поддерживает PHP от 8.3, выбранные версии проверены по официальным источникам. Архив является последовательным overlay на этот каркас, vendor и composer.lock не генерировались.
Последовательность проекта
| Урок | Новый результат |
|---|---|
| 1. Laravel и первый маршрут портала заявок | Разделить фронт-контроллер, маршрут и ответ. |
| 2. Blade и общий шаблон портала | Показать список учебных заявок с экранированием. |
| 3. Миграция таблицы заявок | Зафиксировать схему заявки и связь с пользователем. |
| 4. Модель Eloquent и чтение заявок | Прочитать свои заявки через модель и порядок. |
| 5. Вход по сессии и выход из портала | Создать и завершать серверную сессию. |
| 6. Policy и право на конкретную заявку | Ограничить карточку и изменение владельцем. |
| 7. Form Request и создание заявки | Сохранить только разрешённые и проверенные поля. |
| 8. Редактирование заявки и возврат формы | Обновлять открытую заявку с восстановлением ввода. |
| 9. Комментарии и отношения Eloquent | Сохранить комментарий текущего пользователя. |
| 10. Закрытие заявки и транзакция | Атомарно записать статус и историю закрытия. |
| 11. Фильтр и страницы списка заявок | Ограничить выборку и сохранить параметры фильтра. |
| 12. Очередь и задача подготовки квитанции | Отделить повторяемую фоновую работу от HTTP. |
| 13. Уведомление после фиксации заявки | Создать частное уведомление владельцу. |
| 14. Частное вложение и контролируемая загрузка | Хранить вложение вне public и проверять скачивание. |
| 15. JSON-ресурс и API личного кабинета | Выдать ограниченную карточку через тот же session guard. |
| 16. Конфигурация и передача Laravel-портала | Зафиксировать окружение, миграции и границы выпуска. |
Исходники и самостоятельное воспроизведение
Скачать исходники всех шестнадцати шагов. Сначала прочитайте base/README.md, затем наложите полные файлы lesson-01 … lesson-NN в порядке выбранной главы. Служебные README и snippets не копируются в приложение. Для показанных фрагментов архив содержит полные итоговые составные файлы. Последняя глава передаёт договор дальнейшей подготовки.
example_execution = not_run: код, SQL, HTTP, миграции, приложения и очереди не запускались; пакеты не устанавливались. Описанные изменения и ответы являются ожидаемыми. Проверка этой работы ограничена чтением документации и авторской инвентаризацией файлов, слов и соответствия листингов.
Границы результата
Ранние read-only состояния предназначены только для localhost с вымышленными данными. С урока 05 список получает auth и условие владельца, с 06 карточка и действия используют TicketPolicy. Все изменяющие формы имеют CSRF. Закрытие условно меняет open на closed и записывает closure внутри одной транзакции, повтор не добавляет историю.
Квитанция и уведомление отправляются после commit; database worker нужно организовать отдельно. Это не transactional outbox и не гарантия exactly once. PDF принимается один раз, хранится вне public и выдаётся через policy; отсутствующая квитанция отличается от закрытия заявки. API остаётся same-origin session GET без bearer tokens и write endpoints. Регистрация, восстановление пароля, роли организации и реальная почтовая доставка в курс не включены.