Перейти к содержанию

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. Регистрация, восстановление пароля, роли организации и реальная почтовая доставка в курс не включены.