
Книга посвящена практическим аспектам проектирования архитектуры сложных веб-приложений с примерами на Laravel. Рассматриваются типовые проблемы, возникающие при масштабировании проектов, и подходы к их решению, включая выстраивание слоев приложения, организацию бизнес-логики, разделение ответственности и работу с инфраструктурным кодом. Анализируются распространенные архитектурные ошибки, связанные с чрезмерной зависимостью от фреймворков, и предлагаются альтернативные решения на основе проверенных практик. Описаны обработка ошибок и валидация, реализация доменного слоя, использование архитектурных паттернов CQRS и Event Sourcing. Особое внимание уделено unit-тестированию, управлению зависимостями, событийно-ориентированному подходу и внедрению паттернов, устойчивых к росту сложности.
Для разработчиков, архитекторов ПО и технических руководителей
Идеальная архитектура для сложных проектов
Современные веб-приложения быстро выходят за рамки простых CRUD-интерфейсов. Стандарты MVC, удобные инструменты быстрой разработки и популярные фреймворки, такие как Laravel, на первых этапах помогают, но со временем становятся источником проблем, поскольку рост проекта требует продуманной архитектуры.
Эта книга — практическое руководство по проектированию и развитию сложных веб-приложений. Автор на примерах показывает, как типовые подходы приводят к архитектурной деградации и какие решения позволяют обеспечить развитие проекта: от первых контроллеров с тысячами строк до осмысленного распределения задач между слоями. Вы узнаете:
- Почему принцип «один контроллер правит всеми» — путь к хаосу
- Как выстраивать слои приложения: от запроса к бизнес-логике
- Зачем нужны сервисные классы, value objects и событийно-ориентированный подход
- Как правильно тестировать приложение и не утонуть в абстракциях
- Где проходит граница между удобством и чрезмерной магией фреймворков
Автор рассматривает типовые ошибки роста — перегрузку контроллеров, слепую веру в REST, злоупотребление Active Record и удобством фреймворков. Через призму реального опыта описываются внедрение зависимостей, работа с исключениями, разделение валидации, построение слоя приложений, подходы к unit-тестированию, реализация доменного слоя и архитектурные паттерны вроде CQRS (Command Query Responsibility Segregation) и Event Sourcing.
Разработчикам, архитекторам и руководителям проектов эта книга даст набор проверенных практик, поможет избежать архитектурных ловушек и найти баланс между скоростью разработки и устойчивостью проекта в долгосрочной перспективе.
- Проблемы роста проекта и их решение
- Внедрение зависимостей
- Безболезненный рефакторинг
- Выстраивание слоев приложения
- Обработка ошибок и валидация
- Событийно-ориентированный подход
- Проведение unit-тестирования
- Реализация доменного слоя
- Использование архитектурных паттернов CQRS и Event Sourcing
Книгу “Архитектура cложных веб-приложений: c примерами на Laravel” можно купить в нашем интенет-магазине.
Предисловие…………………………………………………………………………………………….. 6
Глава 1. Плохие привычки………………………………………………………………………. 8
Проблемы роста…………………………………………………………………………………………………………………………… 8
Выделение логики……………………………………………………………………………………………………………………… 10
Соблазнительная «простота» REST…………………………………………………………………………………………. 13
Поклонение темной магии PHP…………………………………………………………………………………………………. 15
«Быстрая» разработка приложений (RAD)……………………………………………………………………………… 17
Преждевременная оптимизация……………………………………………………………………………………………….. 19
Экономия строк кода…………………………………………………………………………………………………………………. 20
Прочие источники боли…………………………………………………………………………………………………………….. 21
Глава 2. Внедрение зависимостей…………………………………………………………… 22
Принцип единственной ответственности…………………………………………………………………………………. 22
Dependency Injection………………………………………………………………………………………………………………….. 25
Наследование…………………………………………………………………………………………………………………………….. 32
Пример с загрузкой картинок……………………………………………………………………………………………………. 35
Начальный рефакторинг…………………………………………………………………………………………………… 37
ООП-путь……………………………………………………………………………………………………………………. 41
Путь конфигурации (Configuration way)…………………………………………………………………. 44
Расширение интерфейсов………………………………………………………………………………………………………….. 45
Трейты………………………………………………………………………………………………………………………………………… 49
Трейты, расширяющие интерфейсы…………………………………………………………………………………. 50
Трейты как части класса…………………………………………………………………………………………………… 51
Трейты как поведение………………………………………………………………………………………………………… 52
Бесполезные трейты…………………………………………………………………………………………………………… 54
Статические методы………………………………………………………………………………………………………………….. 56
Пара слов в конце главы……………………………………………………………………………………………………………. 57
Глава 3. Безболезненный рефакторинг…………………………………………………… 58
«Статическая» типизация………………………………………………………………………………………………………….. 58
Шаблоны…………………………………………………………………………………………………………………………………….. 60
Поля моделей……………………………………………………………………………………………………………………………… 61
Плагин Laravel Idea…………………………………………………………………………………………………………………… 63
Глава 4. Слой приложения…………………………………………………………………….. 65
Передача данных запроса………………………………………………………………………………………………………… 67
Работа с базой данных……………………………………………………………………………………………………………… 71
Сервисные классы или классы команд?………………………………………………………………………………….. 75
Пара слов в конце главы……………………………………………………………………………………………………………. 76
Глава 5. Обработка ошибок…………………………………………………………………… 77
Исключения (Exceptions)…………………………………………………………………………………………………………… 80
Базовый класс исключения……………………………………………………………………………………………………….. 83
Глобальный обработчик…………………………………………………………………………………………………………… 84
Проверяемые и непроверяемые исключения…………………………………………………………………………… 86
Пара слов в конце главы……………………………………………………………………………………………………………. 90
Глава 6. Валидация………………………………………………………………………………… 92
Валидация, связанная с базой данных…………………………………………………………………………………….. 92
Два уровня валидации………………………………………………………………………………………………………………. 95
Валидация аннотациями…………………………………………………………………………………………………………… 96
Проблема данных HTTP-запроса…………………………………………………………………………………….. 97
Проблема сложных структур данных……………………………………………………………………………… 98
Объект-значение (Value objects)……………………………………………………………………………………………….. 98
Объект-значение как композиция других значений……………………………………………………………… 100
Объекты-значения и валидация……………………………………………………………………………………………… 101
Пара слов в конце главы…………………………………………………………………………………………………………. 103
Глава 7. События…………………………………………………………………………………. 104
Транзакции базы данных (Database transactions)…………………………………………………………………. 105
Очереди…………………………………………………………………………………………………………………………………….. 107
Механизм событий………………………………………………………………………………………………………………….. 108
Использование событий Eloquent…………………………………………………………………………………………… 109
Сущности как поля классов-событий…………………………………………………………………………………….. 111
Пара слов в конце главы…………………………………………………………………………………………………………. 113
Глава 8. Unit-тестирование…………………………………………………………………… 114
Первые шаги…………………………………………………………………………………………………………………………….. 114
Тестирование классов с состоянием………………………………………………………………………………………. 118
Тестирование классов с зависимостями………………………………………………………………………………… 120
Зависимости на реальные классы………………………………………………………………………………….. 120
Стабы и фейки………………………………………………………………………………………………………………….. 122
Моки………………………………………………………………………………………………………………………………….. 123
Типы тестов ПО………………………………………………………………………………………………………………………… 124
Тестирование в Laravel……………………………………………………………………………………………………………. 125
Инструменты Laravel для функционального тестирования…………………………………………. 125
Моки Laravel-фасадов……………………………………………………………………………………………………… 129
Unit-тестирование слоя приложения……………………………………………………………………………………… 131
Отсоединяем код от Laravel-фасадов…………………………………………………………………………….. 131
Отсоединяем от базы данных…………………………………………………………………………………………. 133
Стратегия тестирования приложения……………………………………………………………………………………. 136
Глава 9. Доменный слой………………………………………………………………………. 138
Когда и зачем?…………………………………………………………………………………………………………………………. 138
Unit-тестирование…………………………………………………………………………………………………………….. 139
Простота поддержки кода………………………………………………………………………………………………. 141
Шаблоны Active record и Data mapper…………………………………………………………………………… 141
Высокая связность бизнес-логики…………………………………………………………………………………… 141
Сдвиг фокуса с базы данных к предметной области……………………………………………………. 142
Инварианты сущностей…………………………………………………………………………………………………… 143
Реализация доменного слоя……………………………………………………………………………………………………. 143
Пример домена…………………………………………………………………………………………………………………. 143
Доменные события…………………………………………………………………………………………………………… 149
Генерация идентификатора…………………………………………………………………………………………….. 151
Маппинг модели в базу данных……………………………………………………………………………………… 154
Миграции………………………………………………………………………………………………………………………….. 157
Обработка ошибок в доменном слое……………………………………………………………………………………… 161
Пара слов в конце главы…………………………………………………………………………………………………………. 163
Глава 10. Шаблон CQRS………………………………………………………………………. 164
Чтение и запись — это разные ответственности?…………………………………………………………………. 164
Хранимые процедуры и представления…………………………………………………………………………. 164
Репликация master-slave………………………………………………………………………………………………….. 166
Типичный сервисный класс…………………………………………………………………………………………….. 167
Отчеты………………………………………………………………………………………………………………………………. 169
Разделение ответственности за командный запрос……………………………………………………………… 169
Пара слов в конце главы…………………………………………………………………………………………………………. 172
Глава 11. Шаблон Event Sourcing…………………………………………………………. 173
Игра королей……………………………………………………………………………………………………………………………. 173
Unit-тестирование сущностей…………………………………………………………………………………………………. 177
Мир без магии………………………………………………………………………………………………………………………….. 178
Реализация ES………………………………………………………………………………………………………………………….. 179
Уникальные данные в ES-системах……………………………………………………………………………………….. 188
Пара слов в конце главы…………………………………………………………………………………………………………. 189
Заключение………………………………………………………………………………………….. 190
Предметный указатель…………………………………………………………………………. 191
