Перейти к основному содержимому

Обзор архитектуры

Проект построен вокруг Laravel 12, Filament 3, Livewire 3 и MySQL. Архитектура не полностью слоистая: часть логики лежит в Domains, часть в моделях, часть в Filament resources, часть в helpers. Это исторически сложившийся проект, поэтому важно понимать реальные точки входа, а не ожидать идеальную DDD-структуру.

Основные слои

СлойНазначениеОсновные файлы
BootstrapПодключает routes, middleware и exception handlingbootstrap/app.php
ProvidersРегистрируют админку, frontend routes, helpers, сервисыbootstrap/providers.php, app/Providers/*
HTTP routesОбычные web/API endpointsroutes/web.php, routes/api.php
Console routesScheduler для cron-командroutes/console.php
DomainsЛогика каталога, roadmap, интеграций, htaccessapp/Domains/*
ModelsEloquent-модели и большая часть бизнес-инвариантовapp/Models/*
LivewireДинамический публичный UI и отдельные admin/public widgetsapp/Livewire/*
FilamentАдминистративный CRUD и operational screensapp/Filament/*
Views/assetsBlade, Less, Tailwind, JS runtimeresources/views/*, resources/css/*, resources/js/*
DatabaseSQL dump, migrations, settings migrations, seedersdatabase/*

Точка старта приложения

bootstrap/app.php делает три важные вещи:

  • подключает routes/web.php, routes/api.php, routes/console.php;
  • добавляет глобальные middleware LoginByGkUHash и Redirect через prepend;
  • настраивает базовый Laravel application builder.

Из-за prepend эти middleware влияют почти на все HTTP-запросы. Редирект или автологин может произойти до того, как запрос дойдёт до конкретного route/controller.

Провайдеры

bootstrap/providers.php подключает несколько групп провайдеров.

Core/runtime

  • AppServiceProvider — runtime-настройки приложения, Livewire route вне local-окружения, дефолтная пагинация Filament table.

Filament

  • Filament\AppPanelProvider — полностью описывает административную панель.

Frontend

  • BannerServiceProvider — routes для баннеров.
  • ModernCatalogServiceProvider — catch-all route публичного каталога.
  • ModernRoadmapProvider — routes дорожной карты /program.
  • ProxyPageServiceProvider — динамические routes из БД.

Functions/services

  • HelperServiceProvider — подключает PHP helpers из app/Helpers.
  • MorpherServiceProvider — регистрирует сервис morpher.

Auth/profile

  • FortifyServiceProvider.
  • JetstreamServiceProvider.

Важно: Fortify/Jetstream используются не как полностью стандартный scaffold. Их package routes отключены, поэтому не стоит автоматически ожидать стандартные Jetstream routes.

Публичный frontend

Публичный frontend состоит из нескольких независимых входов.

Modern Catalog

Route создаёт ModernCatalogServiceProvider. Контроллер получает сегменты URL, собирает initial state фильтров, подставляет SEO title/head и рендерит pages.modern-catalog.

Modern Roadmap

Routes создаёт ModernRoadmapProvider. Контроллер валидирует шаги, выбирает дефолтные значения, делает редиректы при неполном URL и рендерит pages.modern-roadmap.

Proxy pages

Routes создаёт ProxyPageServiceProvider на основе таблицы landing_proxy_pages. Поэтому полный список публичных страниц нельзя понять только по коду.

Preview pages

routes/web.php содержит набор /preview/* routes для ручной проверки отдельных Blade/Livewire/дизайн-фрагментов.

Админка

Filament panel описана в AppPanelProvider.

Ключевые свойства:

  • path берётся из config('systematika.admin_panel');
  • включены login/password reset;
  • включён SPA-режим Filament;
  • resources автоматически обнаруживаются в app/Filament/Panel/Resources;
  • pages автоматически обнаруживаются в app/Filament/Panel/Pages;
  • navigation groups задают предметные зоны админки;
  • timezone пользователя прокидывается через Livewire-компонент timezone-receiver;
  • доступ в панель проверяет User::canAccessPanel().

Данные

Самая важная особенность БД: стартовая схема создаётся не набором маленьких миграций, а SQL-дампом database/initial_schema.mysql, который применяет первая миграция 0001_01_01_000000_create_initial_schema_and_put_values.php.

После дампа накатываются дельты из database/migrations. Архив старого пути лежит в database/old_migrations и не должен восприниматься как главный bootstrap-источник.

Где живёт бизнес-логика

Бизнес-логика распределена по нескольким местам.

Domains

Здесь лежит логика построения состояния каталога, roadmap, интеграций и htaccess.

Models

Модели содержат relationships, computed attributes, global scopes и side effects в model events. Например ProductOffering при сохранении синхронизирует формат/статус страницы и следит, чтобы у продукта был только один актуальный сезон.

Helpers

Часть cron-логики вынесена в helpers, например handleStatusMovements() и handleTariffMovements().

Filament Resources

Админские формы не просто отображают поля. Они задают UX, зависимости select-ов, relation managers, preview карточек, ограничения удаления и создания.

Главные архитектурные ловушки

  • Route может быть создан провайдером, а не файлом routes/web.php.
  • Route может быть создан записью в БД.
  • Редирект может сработать до controller из-за глобального middleware.
  • Пользователь может быть автоматически создан и залогинен по gk_uhash.
  • Модель может изменить соседние записи при сохранении.
  • Cron может поменять status_id или tariff_id без ручного действия администратора.
  • Состояние кэша страниц зависит от queue worker и внешнего WordPress URL.