Самоучитель: PHP 8.5: инженерный практикум
Глава 18 из 22V. Хранение и время125 минут

Глава 18. CRUD, repository и честная граница ORM

CRUD-кнопка не определяет архитектуру: сценарий выражает намерение, repository скрывает способ хранения, а ORM выбирают после оценки модели и запросов.

После главы вы сможете
  • назвать предметные команды
  • ограничить repository
  • оценить Doctrine без магического мышления

Предметный глагол точнее CRUD

publishWorkout и correctSet сообщают больше, чем update. Команда включает ожидаемую версию и право на действие; успешный переход создаёт историю. Удаление опубликованной тренировки может стать archive, если аудит важнее физического удаления.

Read-модель списка не обязана собираться тем же repository, что сохраняет агрегат. Отдельный query service способен вернуть плоский WorkoutListItem без загрузки полного графа объектов.

Границы хранения

Два пути данныхКомандный путь сохраняет целостный агрегат, а запросный путь оптимизирован под конкретное чтение.CommandintentDomainrulesRepositoryaggregateQueryprojectionDatabasefacts
Командный путь сохраняет целостный агрегат, а запросный путь оптимизирован под конкретное чтение.

Repository не является SQL-конструктором

Методы getOwnedWorkout, save и nextVersion отражают нужды сценария. Универсальный findBy(array $criteria, array $order) протекает деталями хранения наружу и редко выражает намерение.

Mapper восстанавливает объект из строки, но не должен обходить инварианты без документированной причины. Отдельная persisted state factory может быть нужна, если конструктор выражает только создание нового объекта.

Doctrine в 2026

По официальному статусу на август 2026 стабильная линия Doctrine ORM — 3.6, а 4.0 обозначена как upcoming. Атрибуты mapping, EntityManager и Unit of Work снимают много механического кода, но не отменяют SQL, индексы, границы транзакции и стоимость ленивых связей.

N+1 возникает, когда шаблон или сериализатор незаметно инициирует запрос для каждой сущности. Профилируйте фактические запросы и создавайте проекции для списков. flush — эффект; его место определяет прикладной сценарий, а не случайный setter.

Миграция совместима с двумя версиями

Добавление начинается с новой nullable-колонки или таблицы, затем выполняется контролируемый backfill, переключается чтение и только после этого усиливается NOT NULL. Удаление старого поля переносится в следующий релиз.

Schema diff ORM полезен как черновик, но миграция проходит ручной обзор: блокировка таблицы, значение по умолчанию и время на данных production важнее красоты mapping.

Лабораторная работа

Реализуйте publishWorkout через узкий repository и отдельный список недельных тренировок. Затем опишите, какие части изменятся при переходе с ручного PDO на Doctrine 3.6.

Локальный прогресс

Закрепите материал

Отметка, заметка, чек-лист и ответы остаются в localStorage этого браузера и не отправляются в аналитику.

Перелинковка со справочником

Проверка актуальности

  • doctrine-project.orghttps://www.doctrine-project.org/projects/ormПервичный источник для актуализации фактов. Адрес приведён как текст и не является активной ссылкой.
  • dev.mysql.comhttps://dev.mysql.com/doc/refman/8.4/en/Первичный источник для актуализации фактов. Адрес приведён как текст и не является активной ссылкой.

Текст и схемы созданы для этого самоучителя без воспроизведения страниц, иллюстраций и листингов приложенной книги. Проверено: .

Данные этого сервиса

Настройки cookie и локальных данных

Аналитика

Текущий статус: не выбран. До согласия обе аналитические системы не загружаются.

Локальные данные

Удаление затрагивает только ключи PHP-сервиса в этом браузере и требует подтверждения.

Политики

Политика конфиденциальности · Политика использования файлов cookie