Следуя искусству и духу PHP, Zend Framework основывается на простоте, лучших приемах объектно-ориентированного программирования, дружественной к корпорациям лицензионной политике и тщательно протестированном гибком коде. Zend Framework нацелен на разработку более безопасных, надежных и современных Web 2.0-приложений и служб и на применение общедоступных АПИ Из этой книжки
Zend Framework: разработка веб-приложений на PHP. Васвани, автор которой неплохо разбирается в вопросе и отлично владеет техническим языком, вы узнаете, как Zend Framework достигает поставленных целей. Тут вы найдете понятные и подробные объяснения, и законченные примеры, и мы надеемся, что в последствии вы станете с удовольствием разрабатывать собственные приложения при помощи инструмента, ставшего фактическим стандартом - Zend Framework.
Оглавление книги
Zend Framework: разработка веб-приложений на PHP. Васвани
Об авторе . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
О научном редакторе . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
Предисловие . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
Благодарности . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
Вступление . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
Кому адресована эта книга . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
О чем можно узнать из этой книги . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
Соглашения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
Сайт книги . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
Глава 1. Введение в Zend Framework . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
Обзор . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
Возможности . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
Соответствие стандартам и лучшие приемы программирования . . . . . . . . . . . 27
Многократное использование . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
Интернационализация . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
Открытый исходный код . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
Поддержка со стороны сообщества . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
Уникальные преимущества . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
Слабая связанность . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
Быстрая смена релизов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
Политика модульного тестирования . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
Средства генерации кода . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
Доверие рынка . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
Возможность взаимодействия со сторонними приложениями . . . . . . . . . . . . . 30
Варианты коммерческой поддержки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
Исчерпывающая документация . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
Среда для приложений . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
Установка Zend Framework . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
Упражнение 1 .1 . Создание нового проекта . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
Выяснение требований к приложению . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
Создание каталога приложения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
Создание каркаса приложения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
Добавление библиотек Zend Framework . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
Определение настроек виртуальных хостов . . . . . . . . . . . . . . . . . . . . . . . . . . 37
Использование средства командной строки . . . . . . . . . . . . . . . . . . . . . . . . . . 39
Выводы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
Глава 2. Работа с моделями, представлениями, контроллерами
и маршрутами . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
Базовые принципы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
Модели . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
Представления . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
Контроллеры . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
Модули . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
Маршруты . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
Макеты . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
Взаимодействие между компонентами . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
Устройство стандартной главной страницы . . . . . . . . . . . . . . . . . . . . . . . . . . 51
Модульная структура каталогов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
Упражнение 2 .1 . Использование модульной структуры каталогов . . . . . . . . . . . . 55
Создание модуля по умолчанию (default) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
Обновление конфигурационного файла приложения . . . . . . . . . . . . . . . . . . . 56
Основные макеты и пользовательские маршруты . . . . . . . . . . . . . . . . . . . . . . . . 56
Обновление главной страницы приложения . . . . . . . . . . . . . . . . . . . . . . . . . 57
Установка основного макета . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
Использование пользовательского маршрута . . . . . . . . . . . . . . . . . . . . . . . . 60
Упражнение 2 .2 . Обработка статического содержимого . . . . . . . . . . . . . . . . . . . 61
Определение пользовательских маршрутов . . . . . . . . . . . . . . . . . . . . . . . . . . 62
Определение контроллера . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
Определение представления . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
Обновление основного макета . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
Выводы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
Глава 3. Работа с формами . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
Основы работы с формами . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
Создание форм и элементов формы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
Работа с элементами форм . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
Установка обязательных значений и значений по умолчанию . . . . . . . . . . . . 87
Фильтрация и валидация входных данных форм . . . . . . . . . . . . . . . . . . . . . . . . . 91
Использование фильтров ввода . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
Использование валидаторов ввода . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
Использование цепочек валидаторов и фильтров . . . . . . . . . . . . . . . . . . . . 101
Получение и обработка данных форм . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
Упражнение 3 .1 . Создание формы обратной связи . . . . . . . . . . . . . . . . . . . . . . 104
Определение формы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
Использование пользовательского пространства имен . . . . . . . . . . . . . . . . . 107
Определение пользовательского маршрута . . . . . . . . . . . . . . . . . . . . . . . . . 107
Определение контроллеров и представлений . . . . . . . . . . . . . . . . . . . . . . . 108
Обновление основного макета . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
Настройка внешнего вида формы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
Использование пользовательских сообщений об ошибках . . . . . . . . . . . . . . 113
Использование групп отображения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
Использование декораторов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
Выводы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
Глава 4. Работа с моделями . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
Модели . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
Паттерны для моделей . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124
Границы модели . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
Установка Doctrine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
Упражнение 4 .1 . Создание и интеграция моделей Doctrine . . . . . . . . . . . . . . . . 128
Инициализация базы данных приложения . . . . . . . . . . . . . . . . . . . . . . . . . . 128
Генерация моделей Doctrine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
Установка отношений между моделями . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134
Автозагрузка Doctrine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135
Работа с моделями Doctrine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137
Получение записей . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137
Использование фильтров . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138
Группирование и упорядочивание результатов . . . . . . . . . . . . . . . . . . . . . . 138
Объединение таблиц . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138
Добавление, обновление и удаление записей . . . . . . . . . . . . . . . . . . . . . . . 139
Упражение 4 .2 . Получение записей из базы данных . . . . . . . . . . . . . . . . . . . . . 141
Создание нового модуля . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141
Определение пользовательского маршрута . . . . . . . . . . . . . . . . . . . . . . . . . 141
Определение контроллера . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141
Определение представления . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143
Выводы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146
Глава 5. Работа с операциями CRUD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148
Упражнение 5 .1 . Создание записей в базе данных . . . . . . . . . . . . . . . . . . . . . . 149
Определение формы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149
Определение контроллеров и представлений . . . . . . . . . . . . . . . . . . . . . . . 154
Работа с административными действиями . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157
Структура . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158
Маршрутизация . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
Макет . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160
Упражнение 5 .2 . Вывод списка, удаление и обновление записей
базы данных . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160
Установка административного макета . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161
Определение пользовательских маршрутов . . . . . . . . . . . . . . . . . . . . . . . . . 162
Определение действия и представления для вывода списка . . . . . . . . . . . . 163
Определение действия для удаления . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166
Определение формы для обновления . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167
Обработка ввода дат . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170
Определение действия и представления для обновления . . . . . . . . . . . . . . 171
Обновление действия для отображения . . . . . . . . . . . . . . . . . . . . . . . . . . . 175
Добавление аутентификации пользователей . . . . . . . . . . . . . . . . . . . . . . . . . . 176
Упражнение 5 .3 . Создание системы входа/выхода . . . . . . . . . . . . . . . . . . . . . . 178
Определение пользовательских маршрутов . . . . . . . . . . . . . . . . . . . . . . . . . 178
Определение формы входа . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178
Определение адаптера аутентификации . . . . . . . . . . . . . . . . . . . . . . . . . . . 179
Определение действия и представления для входа . . . . . . . . . . . . . . . . . . . 182
Определение действия для выхода . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184
Защита административных действий . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184
Обновление основного макета . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185
Выводы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187
Глава 6. Индексация, поиск и форматирование данных . . . . . . . . . . . . . . . . 188
Упражнение 6 .1 . Поиск и фильтрация записей базы данных . . . . . . . . . . . . . . . 189
Определение формы поиска . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189
Определение контроллера и представления . . . . . . . . . . . . . . . . . . . . . . . . 191
Обновление основного макета . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193
Добавление полнотекстового поиска . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195
Индексация данных . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196
Поиск данных . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198
Упражнение 6 .2 . Создание механизма полнотекстового поиска . . . . . . . . . . . . . 199
Определение расположения индекса . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199
Определение пользовательских маршрутов . . . . . . . . . . . . . . . . . . . . . . . . . 199
Определение действия и представления для индексации . . . . . . . . . . . . . . 200
Обновление сводного представления . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201
Обновление формы поиска . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202
Обновление действия и представления для поиска . . . . . . . . . . . . . . . . . . . 203
Обработка нескольких типов вывода . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206
Упражнение 6 .3 . Вывод результатов поиска в формате XML . . . . . . . . . . . . . . . 207
Включение контекста XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208
Определение представления XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208
Выводы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210Глава 7. Разбиение на страницы, сортировка и загрузка
данных на сервер . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211
Упражнение 7 .1 . Разбиение на страницы и сортировка записей
базы данных . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212
Добавление номеров страниц к маршрутам . . . . . . . . . . . . . . . . . . . . . . . . . 213
Обновление контроллера и представления для главной страницы . . . . . . . . 213
Добавление критериев сортировки к маршрутам . . . . . . . . . . . . . . . . . . . . . 216
Обновление контроллера и представления . . . . . . . . . . . . . . . . . . . . . . . . . 216
Обработка загружаемых на сервер файлов . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220
Упражнение 7 .2 . Добавление возможности загрузки изображений . . . . . . . . . . 224
Определение целевого каталога для загруженных файлов . . . . . . . . . . . . . 224
Обновление определения формы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225
Обновление действия для создания . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226
Обновление действия и представления для отображения . . . . . . . . . . . . . . 228
Обновление действия для удаления . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230
Работа с конфигурационными данными . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233
Чтение конфигурационных файлов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233
Запись конфигурационных файлов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 234
Упражнение 7 .3 . Настройка параметров приложения . . . . . . . . . . . . . . . . . . . . 238
Определение формы настройки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238
Определение конфигурационного файла . . . . . . . . . . . . . . . . . . . . . . . . . . . 240
Определение пользовательских маршрутов . . . . . . . . . . . . . . . . . . . . . . . . . 240
Определение контроллера и представления . . . . . . . . . . . . . . . . . . . . . . . . 241
Обновление основного макета . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243
Использование конфигурационных данных . . . . . . . . . . . . . . . . . . . . . . . . . 245
Выводы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 248
Глава 8. Журналирование и отладка исключений . . . . . . . . . . . . . . . . . . . . . 250
Исключения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 251
Стандартный процесс обработки ошибок . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 254
Использование пользовательских классов исключений . . . . . . . . . . . . . . . . 257
Управление видимостью исключений . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259
Упражнение 8 .1 . Создание пользовательской страницы
с сообщением об ошибке . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 260
Журналирование данных . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262
Запись сообщений журнала . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263
Добавление данных в сообщения журнала . . . . . . . . . . . . . . . . . . . . . . . . . 267
Форматирование сообщений журнала . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 268
Упражнение 8 .2 . Журналирование исключений приложения . . . . . . . . . . . . . . . 271
Определение расположения журнала . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272
Определение класса записи в базу данных . . . . . . . . . . . . . . . . . . . . . . . . . 272
Обновление контроллера ошибок . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273
Выводы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 277
Глава 9. Локализация приложений . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279
Локализация и локали . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 280
Установка локали приложения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 282
Локализация чисел . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284
Локализация дат и времени . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286
Локализация валют . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 289
Локализация единиц измерения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291
Локализация строк . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 294
Работа с адаптерами и источниками данных . . . . . . . . . . . . . . . . . . . . . . . . 296
Использование локали приложения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 298
Использование вспомогательного класса представления для перевода