Надёжный подход к любым техническим задачам

Михаил Анкудинов Magbusjap

Рейтинг: 1 693
Паспорт верифицирован
Всего отзывов: 7 0
Выполнил заданий: 8
  • Работ в портфолио: 11
  • Типовых услуг: 0
  • Работ на продажу: 0
  • Возраст: 33 года
  • Стаж работы: 6 лет
  • Зарегистрирован: 12.06.2013
  • Образование: Среднее профессиональное
  • Юридический статус:Самозанятый
  • Стоимость услуг (руб): 1 000 за час 70 000 за месяц
Был на сайте:

Гибкая система портфолио для Laravel-сайта с тремя типами проектов и auto-unpack ZIP

Используемые навыки:

Описание

Универсальная система управления проектами в портфолио для bozheslav.ru. Поддерживает три разных типа размещения работ — от интерактивных демо до ссылок на внешние ресурсы — с единой админкой в Filament.

Решение

— Порядок маршрутов критичен: конкретные /portfolio/demo/{slug}, /portfolio/pages/{slug} должны быть выше универсального /{slug} catch-all в routes/web.php — Laravel берёт первое совпадение
— Nginx vs Laravel роутинг: location-блок без try_files $uri $uri/ /index.php?$query_string тихо перехватывал динамические пути — классическая ошибка на production
— Slug-based storage: имена папок distro-safe (только латиница, дефисы) — избегает проблем с кириллицей в файловой системе

Результат

— Три типа проектов:
• Demo — интерактивные работы с живым кодом (HTML/CSS/JS). Загружается ZIP-архивом, автоматически распаковывается в storage/demo/{slug}/, становится доступен по URL вида /portfolio/demo/{slug}. Автор загружает архив — не думает про FTP и распаковку
• Page — полноценные страницы-кейсы со своей вёрсткой, хранятся в таблице portfolio_pages. Для детальных разборов проектов с иллюстрациями и текстом
• External — ссылки на внешние работы (live-сайты, GitHub, статьи на сторонних ресурсах). Карточка ведёт на внешний URL
— Единая админка в Filament:
• Один Resource PortfolioResource управляет всеми типами через dropdown type
• Поля формы динамически меняются в зависимости от выбранного типа
• Для Demo — поле загрузки ZIP с preview файлов после распаковки
• Для Page — связь с portfolio_pages таблицей
• Для External — просто поле URL
— Auto-unpack ZIP для Demo:
• afterCreate() хук в Filament извлекает архив
• Валидация структуры (должен быть index.html в корне)
• Автоматическая очистка старых файлов при перезагрузке архива
• Защита от path traversal при распаковке
— Маршрутизация:
• /portfolio/demo/{slug} → статика из storage/demo/
• /portfolio/pages/{slug} → PortfolioPageController + Blade-шаблон
• /portfolio → каталог всех работ с фильтрацией по типу/категории
• Nginx location ^~ /portfolio/ с корректным try_files — статика не перехватывает динамические роуты

Презентация проекта

2026-04-22_20-36-11.png
2026-04-22_20-36-27.png
2026-04-22_20-36-40.png

Оценили проект:

0