> Доброе утро пятницы! Последний рывок перед выходными
ORM.XML: Чистота сущностей в Doctrine
На этой неделе снова убедился, что подход с ORM.XML в Doctrine — недооценённый инструмент. Пока многие гонятся за атрибутами и аннотациями, продолжаю использовать XML-маппинг.
Что это и зачем
Суть простая: конфигурация маппинга сущностей выносится в отдельные XML-файлы. Сущность (Entity) остаётся максимально чистой — без доктриновских атрибутов, аннотаций или трейтов. Она просто описывает бизнес-сущность и её поведение, ничего не зная о том, как она сохраняется в базу.
Плюсы подхода
Чистота сущностей Сущность не знает об инфраструктуре. Она описывает бизнес-правила, валидацию и поведение — и ничего больше. Это Domain-модель в чистом виде. Легко тестировать, легко менять, легко переиспользовать.
Независимость от фреймворка Хотите завтра перейти с Doctrine на Eloquent или вообще на чистый PDO? Сущности не пострадают. Всё, что нужно — переписать маппинг и репозитории. Бизнес-логика останется нетронутой.
ValueObject — это сила Комбинация с ValueObject даёт невероятную гибкость. Взгляните: \CustomerInfo\ как ValueObject инкапсулирует логику работы с именем и телефоном, а маппинг просто «привязывает» его к таблице. Можно добавлять методы форматирования, валидации — и они всегда будут в одном месте.
Схема в коде и БД синхронизируется XML даёт чёткое представление о структуре. Можно посмотреть на файл и сразу понять, какие поля есть в таблице, какие типы, какие связи. Это как документация, которая всегда актуальна.
Легче мержить При работе в команде XML-файлы мержатся проще, чем атрибуты, разбросанные по коду. Меньше конфликтов на пустом месте.
Минусы подхода Приходится синхронизировать сущность и XML-файл, что добавляет лишнее движение и требует внимательности.
Итог Для меня это меньшее из зол. Да, нужно держать в голове два места, но чистота кода и гибкость архитектуры того стоят. Особенно когда проект живёт долго, переживает несколько смен фреймворков и требует постоянного рефакторинга.
А когда к этому добавляются ValueObject, маппинг становится почти прозрачным. Взгляните на \CustomerInfo: одна сущность, одна логика, один маппинг. Всё на своих местах. Можно спокойно переносить такой модуль между проектами, не переживая за сохранность данных.
> 👉 Полные примеры кода с подсветкой синтаксиса смотрите в Gist, т.к. “Сетка”, надеюсь пока, не умеет в подсветку кода.
Всем хороших выходных! Пусть код будет чистым, а архитектура — гибкой. Если на неделе что-то не успели — всегда есть понедельник, чтобы начать с новыми силами.
#AmbrionDev #Doctrine #ORM #ValueObject #Architecture #PHP
«Используете ли вы XML-маппинг или предпочитаете атрибуты? Есть ли у вас кейсы, где этот подход выручил или, наоборот, подвёл? Делитесь в комментариях!👇»