Самоучитель: динамические веб-приложения
Глава 15 из 18VII. Инженерная устойчивость105 минут

Глава 15. Архитектура, Composer и вертикальные сценарии

Структура проекта должна показывать, где живёт предметное правило, где адаптер и где собираются зависимости; Composer делает эту структуру воспроизводимой.

После главы вы сможете
  • построить вертикальный срез
  • направить зависимости внутрь
  • зафиксировать пакеты lock-файлом

Вертикальный срез вместо каталогов-заглушек

Начните с одного завершённого сценария: маршрут, проверка входа, use case, repository, шаблон или JSON и тест. Только после этого обобщайте повторяющиеся элементы. Десятки пустых директорий Domain, Services и Helpers не создают архитектуру.

Каждый слой должен иметь причину изменения. HTTP меняется из-за протокола, use case — из-за предметного процесса, repository adapter — из-за способа хранения.

Направление зависимостей

Границы приложенияВнешние адаптеры знают внутренние контракты; предметный код не импортирует PDO, Request или шаблонизатор.HTTP/CLIadapterApplicationuse caseDomainrulesPortscontractsInfrastructureimplements
Внешние адаптеры знают внутренние контракты; предметный код не импортирует PDO, Request или шаблонизатор.

Composer как часть архитектуры

require содержит runtime-зависимости, require-dev — инструменты анализа и тестов. composer.lock фиксируется для приложения. Скрипты Composer не должны выполнять недоверенный код без обзора, а install в production запускается с подходящими флагами и проверенным lock-файлом.

Platform requirements фиксируют PHP и ext-*. Команда check-platform-reqs полезна после установки на целевом хостинге.

PSR-4 и имена

{
  "autoload": {
    "psr-4": {
      "App\\": "src/"
    }
  }
}

Контейнер и явные зависимости

Небольшой проект способен собрать объекты обычным PHP-кодом. DI-контейнер полезен при большом графе, но его конфигурация остаётся composition root. Класс не запрашивает container->get() внутри метода: иначе зависимость снова становится скрытой.

Статические фасады и глобальные helpers кажутся короткими, но усложняют изоляцию теста и замену часов, хранилища или отправителя.

Когда нужен фреймворк

Фреймворк экономит время на маршрутизации, middleware, шаблонах и интеграции библиотек. Он не определяет предметные границы за вас. Выбирайте его по требованиям команды, сроку поддержки, экосистеме и способности обновляться, а не по размеру демонстрационного приложения.

Сохраните предметный сценарий тестируемым без запуска полного HTTP-ядра. Тогда смена adapter или версия фреймворка не превращается в переписывание правил.

Практика главы

Соберите вертикальный срез создания задачи. Покажите файлы route, controller, command, handler, repository interface, PDO adapter и тест. Объясните направление каждого import.

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

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

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

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

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

  • getcomposer.orghttps://getcomposer.org/doc/01-basic-usage.mdПервичный источник для актуализации фактов. Адрес приведён как текст и не является активной ссылкой.
  • php-fig.orghttps://www.php-fig.org/psr/psr-4/Первичный источник для актуализации фактов. Адрес приведён как текст и не является активной ссылкой.

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

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

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

Аналитика

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

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

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

Политики

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