7.5 KiB
Cabinet: архитектура модулей
apps/cabinet - legacy-монолит личного кабинета на Symfony 5.4. Он обслуживается контейнером php82, nginx направляет cabinet.sovamed.ru в apps/cabinet/public/index.php.
Слои
flowchart TB
browser[Browser]
controllers[Controller\n14 классов]
forms[Form\n19 классов]
services[Service\n4 класса]
bundles[Bundle\nлокальные интеграции]
repositories[Repository\n21 класс]
entities[Entity\n21 класс]
twig[Twig templates]
assets[Webpack Encore assets]
db[(PostgreSQL)]
bitrix[(Bitrix)]
mis[Infoclinica / MIS]
external[Calltouch, SMS, Notisend, Yandex Direct]
browser --> controllers
controllers --> forms
controllers --> services
controllers --> bundles
controllers --> repositories
repositories --> entities
repositories --> db
controllers --> twig
twig --> assets
services --> repositories
bundles --> bitrix
bundles --> mis
bundles --> external
Контроллеры
Пользовательский кабинет
SecurityController- login/logout, регистрация, восстановление, настройки, платежи, история болезни, направления, refund, проверка авторизации API.DefaultController- главная кабинета, вызов врача на дом, стоимость услуг, админское обновление прайса, справка.SpecialistController- каталог врачей, карточка врача, онлайн-специалисты, избранное.WidgetController- справки, review source, проверка записи/виджета.
Поток защищенной страницы:
sequenceDiagram
participant User
participant Security as Security Firewall
participant Controller
participant Service
participant Repository
participant Twig
User->>Security: GET / или /payment
Security->>Controller: проверка сессии / ROLE_USER
Controller->>Service: подготовка данных
Service->>Repository: запросы к БД
Repository-->>Service: сущности
Service-->>Controller: данные
Controller->>Twig: render
Twig-->>User: HTML
Админка и CMS
BannerController- баннеры.CategoryPageControllerиPageController- категории и страницы.DepartmentController- отделения.ReviewSourceController- источники отзывов.WidgetFormController,WidgetFormInputController- конструктор форм виджетов.
Большинство таких контроллеров используют Symfony Forms и Doctrine repositories напрямую.
API
PublicAPIController- публичные методы/api: anonymous reserve, интервалы расписания, данные пользователя, прайс, врачи.InternalAPIController- swagger, captcha, баннеры, логирование, запись, сообщения, поиск, отделения.CalltouchAPIController- добавление заявки Calltouch.
Локальные Bundle-интеграции
В src/Bundle находятся не Symfony bundle в классическом смысле, а локальные клиенты/утилиты:
Infoclinica\ClientиInfoclinica\Rest- низкоуровневый HTTP-клиент и набор методов MIS: записи, профиль, платежи, бонусы, направления, история болезни, login, reserve.Bitrix\Request- врачи, отзывы, изображения, филиалы, отделения, услуги.Calltouch\Request- заявки и выборки звонков/обращений.Sms\ManagerиNotisend\Request- отправка сообщений.Yandex\Direct- отчеты и сущности Direct.Crypt\AES- AES-операции.Helper\AmountInWords- сумма прописью.Utils\Logger- логирование.
Сервисы
PriceListService- фильтрация и построение запросов прайса.SpecialistService- списки и карточки врачей.SpecialistMoreService- вычисляемая информация по врачу: локации, цены, отзывы, минимальная цена.UserCleanupService- очистка просроченных/неподтвержденных пользователей.
Формы и Twig
flowchart LR
controller[Controller] --> form[Symfony Form]
form --> entity[Entity]
controller --> twig[Twig template]
twig --> encore[Webpack Encore assets]
encore --> public[public/build]
Формы лежат в src/Form; шаблоны - в templates; frontend-ассеты - в assets; сборка описана в webpack.config.js и package.json.
Авторизация
Security использует LoginFormAuthenticator. Пользователь берется из App\Entity\User по email, пароль хешируется bcrypt. Logout удаляет cookies CABINET_SESSION, WR_SESSION, WR_FLASH, PLAY_SESSION, WR_DETAIL, region.
sequenceDiagram
participant User
participant Login as SecurityController
participant Auth as LoginFormAuthenticator
participant Provider as User Provider
participant Session
User->>Login: POST /login
Login->>Auth: credentials
Auth->>Provider: load user by email
Provider-->>Auth: User
Auth->>Session: создать сессию
Session-->>User: cookies
Консольные команды
Команды в src/Command синхронизируют данные из Infoclinica/Bitrix, обновляют врачей и прайсы, сравнивают врачей, работают с Yandex Direct, AES и очисткой пользователей.
flowchart TB
cron[Cron / ручной запуск] --> cmd[Symfony Command]
cmd --> base[BaseCommand]
cmd --> bundles[Bundle clients]
cmd --> services[Services]
services --> repositories[Repositories]
repositories --> db[(PostgreSQL)]
Доменные сущности
User- пользователь кабинета: email, роли, пароль, UID, token, ФИО, телефон, флаг подтверждения, активность.SpecialistView- представление врача: имя, специальность, категория, опыт, описание, alias,dcode, регион, услуга, признак ДМС.LocationView- представление локации врача:dcode, отделение, филиал, режим online, ближайшая дата.PriceList,PriceDepartment,Price- прайс и группы.RecordиAlertSms- запись и связанное SMS-уведомление.City,Filial,ReviewSource,Banner- региональная структура и источники отзывов.CategoryPage,Page- CMS-страницы.WidgetForm,WidgetFormInput- формы виджетов.DirectCompany,DirectReport- данные Яндекс Директа.
Полная ER-схема вынесена на страницу Модели данных.