Тема
Переиспользование
Самый мощный рычаг скорости. Код, который не пишешь заново, — самый быстрый и надёжный.
Уровень 1. Свой starter-репозиторий
Разовое вложение (~1 день) с максимальной отдачей: каждый новый проект стартует с 60–70% готовности, и все конвенции уже студийные.
Состав рекомендуемого стартера:
laravel new + breeze (blade)
+ filament (панель /admin)
+ spatie: permission, medialibrary, sitemap, honeypot, activitylog, backup
+ laravel-lang/common (русская валидация из коробки)
+ pint + larastan + pest (качество)
+ docker-compose студии (app/nginx/postgres/redis/queue/scheduler)
+ trustProxies + URL::forceScheme под Caddy (уже отработано в proxy)
+ типовые Filament-ресурсы: Pages, SeoBlocks, Forms/Leads, Settings
+ кастомные stubs под declare(strict_types=1) и $castsПочему свой стартер лучше чужого бойлерплейта: чужой кит нужно адаптировать под конвенции студии (CLAUDE.md, specs/), а свой — уже им соответствует. Экономия — не только время сборки, но и отсутствие «чужих» решений, которые команда не понимает.
Уровень 2. Копируемые модули
Сущности, которые повторяются почти в каждом проекте. Держать эталонную реализацию и переносить копированием + переименованием:
| Модуль | Что переносится |
|---|---|
| Формы/заявки (Leads) | Модель + FormRequest + Filament-ресурс + Telegram-уведомление + honeypot |
| Страницы (Pages) | Модель со slug + Blade-рендер + SEO-поля + Filament-ресурс |
| SEO-блоки | Таблица seo_blocks + SeoService + <x-seo-blocks> (по спецификации SEO) |
| Настройки сайта | spatie/laravel-settings + Filament-страница |
| Отзывы/рейтинги | Модель + модерация + агрегат + вывод |
| Города/мультигород | BelongsToCity trait + scope + ResolveCity middleware |
| Склонения (RU) | HasDeclensions trait |
Правило: переносимый модуль должен быть самодостаточным (миграция + модель + ресурс + тест в одном месте), чтобы копирование не тянуло скрытых зависимостей.
Уровень 3. Пакеты вместо своего кода
Прежде чем писать — искать готовое. Полный каталог: OSS-библиотеки. Самые частые «не пиши сам»:
| Соблазн написать самому | Взять готовое |
|---|---|
| Загрузка/ресайз картинок | spatie/laravel-medialibrary + intervention/image |
| Роли и права | spatie/laravel-permission |
| Slug из названия | spatie/laravel-sluggable (кириллица транслитерируется) |
| Сортировка drag&drop | spatie/eloquent-sortable |
| Дерево категорий | staudenmeir/laravel-adjacency-list |
| Статусы-автомат | spatie/laravel-model-states |
| Переводы полей | spatie/laravel-translatable |
| Настройки в БД | spatie/laravel-settings |
| Бэкапы | spatie/laravel-backup |
| Sitemap | spatie/laravel-sitemap |
| Кошельки/балансы | bavix/laravel-wallet |
| Экспорт в Excel | maatwebsite/excel или spatie/simple-excel |
| OpenAPI-дока | dedoc/scramble (автогенерация) |
Дефолт — Spatie: обновляются под новые мажоры Laravel в первые недели, документация эталонная. Если есть пакет Spatie под задачу — обычно брать его.
Уровень 4. Snippets и трейты внутри проекта
- Трейт создавать от 3 моделей с одинаковым поведением (по спецификации моделей), не раньше — преждевременная абстракция замедляет.
- Scope создавать от 2 использований одного WHERE.
- Blade-компонент вместо
@includeглубже 3 уровней. - Config/Enum/Constants для магических значений (по anti-hardcode) — выносить один раз, переиспользовать везде.
Цена переиспользования: зависимости и апгрейды
Каждый пакет — потенциальный блокер при переходе на новый мажор Laravel (выходит ежегодно). Баланс:
- Брать пакет, если он экономит десятки часов и активно поддерживается (Spatie, first-party).
- Писать самому тривиальное (slug из 5 строк, простой sort_order), чтобы не плодить зависимости ради мелочи.
- Проверять 4 сигнала перед внедрением: дата релиза, скорость issues, поддержка текущего Laravel, необработанные PR.
Антипаттерн: копипаста без осмысления
Переиспользование ≠ слепой Ctrl+C. Скопированный модуль прочитать целиком и перенести всю уникальную информацию (правило студии «Перед заменой файла — прочитай его полностью»). Мёртвый код из донора — удалить, не тащить «на всякий случай».