Skip to content

Переиспользование

Самый мощный рычаг скорости. Код, который не пишешь заново, — самый быстрый и надёжный.

Уровень 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&dropspatie/eloquent-sortable
Дерево категорийstaudenmeir/laravel-adjacency-list
Статусы-автоматspatie/laravel-model-states
Переводы полейspatie/laravel-translatable
Настройки в БДspatie/laravel-settings
Бэкапыspatie/laravel-backup
Sitemapspatie/laravel-sitemap
Кошельки/балансыbavix/laravel-wallet
Экспорт в Excelmaatwebsite/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. Скопированный модуль прочитать целиком и перенести всю уникальную информацию (правило студии «Перед заменой файла — прочитай его полностью»). Мёртвый код из донора — удалить, не тащить «на всякий случай».

Внутренняя база знаний студии