Тема
Anti-hardcode — вынесение констант
Правило
Магическое число/строка встречается 2+ раз или имеет бизнес-смысл → выноси.
Куда выносить
config/*.php — пороги, лимиты, настройки
- Pagination size, upload max size, rate limit, cache TTL
- Search radius, max distance, бизнес-пороги
- Цена тарифа, срок оплаты, валюта, комиссия
- URLs API, ключи сервисов (через
env()→config()) - Feature flags
- Доступ — только
config('key'), никогдаenv()в коде
App\Enums\* — статусы, типы, роли
- Статусы модели (
draft,published,archived) - Типы (
boost,paid,free), роли (admin,moderator,user) - Валюты, языки, форматы
- Столбец БД —
$table->enum()с теми же значениями + cast в PHP Enum class
lang/*/*.php — текст UI
- Любой текст пользователю — через
__('key')/trans() - Кнопки, заголовки, placeholder, валидация, email
- Даже в одноязычном проекте — готовность к i18n
app/Support/Constants/ — регексы, ключи
- Регексы (телефон, slug, URL) — именованная константа
- Ключи кеша —
CacheKeys::ORG_LIST, не строка - Ключи сессии/cookie, HTTP headers
Blade — запрещённый хардкод
- URL → только
route('name') - Ассеты →
asset(),Vite::asset(),Storage::url() - Локаль →
app()->getLocale(), не'ru' - Даты →
->translatedFormat('d F Y'), не->format('d.m.Y') - CSS бизнес-значения → data-атрибут или component prop
Миграции/сидеры
- Города, категории, тарифы — из JSON/CSV/API, не хардкод
- Ссылки — по slug/email/name, не по id
Примеры
| Запрещено | Правильно |
|---|---|
->paginate(20) | ->paginate(config('catalog.pagination.organizations')) |
where('status', 'active') | where('status', OrgStatus::Active) |
$org->tier === 'boost' | $org->tier === Tier::Boost |
return 'Организация сохранена' | return __('messages.organization.saved') |
Cache::tags(['orgs', 'city-moscow']) | Cache::tags([CacheTags::ORGANIZATIONS, CacheTags::city($slug)]) |
if ($distance < 5000) | if ($distance < config('catalog.search.nearby_radius_meters')) |
<a href="/ru/moscow/food"> | route('city.category', [...]) + __('categories.food') |