Опубликовано

Новинка: “Архитектура cложных веб-приложений: c примерами на Laravel”

Архитектура cложных веб-приложений: c примерами на Laravel

Книга посвящена практическим аспектам проектирования архитектуры сложных веб-приложений с примерами на 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