Using Zend Framework 3
A free and open-source book on ZF3 for beginners
Home
Samples
Class Reference
Contribute
This book is available in:
English
Русский
Español
Français
Português
Table of Contents
Предисловие
Об этой книге
Для кого эта книга
Примеры и исходный код
Ваши отзывы
Об авторе
Acknowledgments
1. Введение в Zend Framework 3
1.1. Что такое Zend Framework 3?
1.2. Пример PHP веб-сайта
1.2.1. Домашняя страница
1.2.2. Страница Login
1.2.3. Страница Logout
1.2.4. Анализ кода
1.3. Лицензия
1.4. Пользовательская поддержка
1.5. Исходный код фреймворка
1.5.1. Стандарты оформления кода
1.6. Поддерживаемые операционные системы
1.7. Системные требования
1.8. Безопасность
1.9. Производительность
1.10. Шаблоны проектирования
1.11. Основные компоненты ZF3
1.12. Отличия от Zend Framework 2
1.12.1. Обратная совместимость
1.12.2. Компоненты
1.12.3. Установщик компонентов
1.12.4. Производительность ServiceManager и EventManager
1.12.5. PSR-4
1.12.6. Middleware
1.12.7. Фокус на документации
1.13. Выводы
2. Скелетное приложение
2.1. Загрузка Zend Skeleton Application
2.2. Типичная структура директории
2.3. Зависимости приложения
2.4. Виртуальный хост Apache
2.5. Открытие веб-сайта в браузере
2.6. Создание проекта NetBeans
2.7. Файл доступа к гипертексту (.htaccess)
2.8. Блокирование доступа к веб-сайту по IP-адресу
2.9. Аутентификация HTTP
2.10. Включение нескольких виртуальных хостов
2.11. Файл Hosts
2.12. Расширенные сведения о Composer
2.12.1. Имена и версии пакетов
2.12.2. Установка и обновление пакетов
2.12.3. Добавление новой зависимости
2.12.4. Виртуальные пакеты
2.12.5. Composer и системы контроля версий
2.13. Выводы
3. Как работает веб-сайт
3.1. Классы PHP
3.2. Пространства имен PHP
3.3. Интерфейсы PHP
3.4. Автозагрузка классов в PHP
3.4.1. Автозагрузчик карты классов
3.4.2. Стандарт PSR-4
3.4.3. Автозагрузчик, предоставляемый Composer'ом
3.4.4. PSR-4 и структура исходных каталогов
3.5. HTTP-запрос и ответ
3.6. Входной скрипт сайта
3.7. События и жизненный цикл приложения
3.8. Конфигурация приложения
3.8.1. Файлы настройки на уровне приложения
3.8.2. Дополнительные файлы конфигурации на уровне приложения
3.8.3. Файл конфигурации разработки на уровне приложения
3.8.4. Дополнительные файлы разработки на уровне приложения
3.8.5. Файлы конфигурации на уровне модуля
3.8.6. Объединение файлов конфигурации
3.9. Точка входа модуля
3.10. Менеджер сервисов
3.10.1. Регистрация сервиса
3.10.2. Имена сервисов
3.10.3. Переопределение существующего сервиса
3.10.4. Регистрация вызываемых (invokable) классов
3.10.5. Регистрация фабрики
3.10.6. Регистрация абстрактной фабрики
3.10.7. Регистрация псевдонима сервиса
3.10.8. Общие (shared) и необщие (non-shared) сервисы
3.10.9. Конфигурация менеджера сервисов
3.11. Менеджеры плагинов
3.12. О менеджере событий
3.12.1. Event и MvcEvent
3.12.2. EventManager и SharedEventManager
3.13. Выводы
4. Модель-представление-контроллер
4.1. Пример Hello World на GitHub
4.2. Разделение бизнес-логики и представления
4.3. Контроллеры
4.3.1. Класс базового контроллера
4.4. Извлечение данных из HTTP-запроса
4.5. Извлечение переменных GET и POST
4.6. Ввод данных в HTTP-ответ
4.7. Контейнеры для переменных
4.8. Выражаем ошибочное состояние
4.9. Регистрация контроллера
4.9.1. Регистрация фабрики контроллера
4.9.2. LazyControllerAbstractFactory
4.10. Когда создавать новый контроллер?
4.11. Плагины контроллера
4.11.1. Пишем свой собственный плагин контроллера
4.12. Представления
4.13. Помощники представления
4.14. Имена шаблонов представления
4.14.1. Переопределение стандартных имен шаблонов представления
4.15. View Resolver
4.16. Отключение рендеринга представления
4.17. Стратегии рендеринга представления
4.17.1. Ответ в виде JSON
4.18. Страницы ошибок
4.19. Модели
4.20. Типы моделей
4.20.1. Сущности (Entities)
4.20.2. Репозитории (Repositories)
4.20.3. Объекты-значения (Value Objects)
4.20.4. Сервисы (Services)
4.20.5. Фабрики (Factories)
4.21. Определение корректного типа модели
4.22. Другие типы моделей
4.23. Тонкие контроллеры, толстые модели, простые представления
4.23.1. Тонкие контроллеры
4.23.2. Толстые модели
4.23.3. Простые шаблоны представления
4.24. Выводы
5. Маршрутизация
5.1. Структура URL
5.2. Типы маршрутов
5.3. Комбинирование типов маршрутов
5.3.1. SimpleRouteStack
5.3.2. TreeRouteStack
5.4. Конфигурация маршрутизации
5.4.1. Конфигурация для простых маршрутов
5.4.2. Конфигурация для вложенных маршрутов
5.4.3. Конфигурация маршрутизации по умолчанию в Zend Skeleton Application
5.5. Тип маршрута Literal
5.6. Тип маршрута Segment
5.7. Тип маршрута Regex
5.8. Другие типы маршрутов
5.8.1. Hostname
5.8.2. Scheme
5.8.3. Method
5.9. Извлечение параметров из маршрута
5.9.1. Извлечение объектов RouteMatch и Router
5.10. Генерация URL из маршрута
5.10.1. Генерация URL в шаблонах представлений
5.10.1.1. Передача параметров
5.10.1.2. Генерация абсолютного URL
5.10.1.3. Задание запроса (Query)
5.10.2. Генерация URL в контроллерах
5.10.3. Кодирование URL
5.11. Написание собственного типа маршрута
5.11.1. RouteInterface
5.11.2. Пользовательский класс маршрута
5.12. Выводы
6. Внешний вид страницы и лэйаут
6.1. О таблицах стилей CSS и Twitter Bootstrap
6.2. Лэйаут страницы в Zend Framework 3
6.3. Видоизменение стандартного лэйаута страницы
6.4. Переключение между лэйаутами
6.4.1. Установка лэйаута для всех действий контроллера
6.5. Частичные представления
6.6. Placeholder View Helper
6.7. Добавление скриптов на веб-страницу
6.7.1. Пример
6.8. Добавление таблиц стилей CSS на веб-страницу
6.8.1. Пример
6.9. Написание собственных помощников видов
6.9.1. Меню
6.9.2. Навигационная цепочка
6.10. Класс ViewModel и композиция страницы
6.11. Выводы
7. Cбор пользовательских данных с помощью форм
7.1. Скачайте пример Form Demo с GitHub
7.2. Об HTML-формах
7.2.1. Наборы полей (fieldsets)
7.2.2. Пример: Форма обратной связи "Contact Us"
7.2.3. Методы GET и POST
7.3. Стилизация HTML-форм с помощью Twitter Bootstrap
7.4. Установка компонентов ZF3 для работы с формами
7.5. Извлечение данных формы в действии контроллера
7.6. Формы и шаблон «модель-представление-контроллер»
7.6.1. Типичный процесс использования формы
7.7. Модель формы
7.8. Элементы форм
7.8.1. Добавление элементов к модели формы
7.8.2. Метод 1: Передача экземпляра элемента
7.8.3. Метод 2: Использование описания в виде массива
7.9. Пример: Создание модели формы обратной связи
7.10. Добавление правил валидации формы
7.10.1. Фильтр входных данных (Input filter)
7.10.2. Добавление входов в фильтр
7.10.2.1. Настройка фильтра
7.10.2.2. Настройка валидатора
7.10.3. Создание фильтра входных данных для формы обратной связи
7.11. Использование формы в действии контроллера
7.11.1. Передача модели данных формы
7.12. Представление формы
7.12.1. Подготовка модели формы к визуализации
7.13. Стандартные помощники видов форм
7.13.1. Визуализация элемента формы
7.13.2. Визуализация ошибок валидации элемента
7.13.3. Визуализация метки элемента
7.13.4. Визуализация строки формы
7.13.5. Визуализация формы целиком
7.14. Пример: создание шаблона представления для формы обратной связи
7.14.1. Применение CSS-стилей Bootstrap к форме
7.14.2. Стилизация списка ошибок валидации
7.14.3. Добавление страниц "Thank You" и "Error Sending Email"
7.14.4. Результат
7.15. Выводы
8. Преобразование входных данных с помощью фильтров
8.1. О фильтрах
8.1.1. FilterInterface
8.2. Обзор стандартных фильтров
8.3. Инстанцирование фильтра
8.3.1. Способ 1: Инстанцирование фильтра вручную
8.3.2. Способ 2: Создание фильтра с помощью StaticFilter
8.3.3. Способ 3: Создание фильтра из массива
8.4. О менеджере плагинов фильтров
8.5. Поведение фильтра в случае некорректных входных данных
8.6. Примеры использования фильтров
8.6.1. Фильтры, приводящие входные данные к определенному типу
8.6.1.1. Фильтр ToInt
8.6.1.2. Фильтр Boolean
8.6.1.3. Фильтр ToNull
8.6.1.4. Фильтр DateTimeFormatter
8.6.2. Фильтры, выполняющие манипуляции с путем файла
8.6.2.1. Фильтр BaseName
8.6.2.2. Фильтр Dir
8.6.2.3. Фильтр RealPath
8.6.3. Фильтры, осуществляющие сжатие и шифрование входных данных
8.6.3.1. Фильтр Compress
8.6.3.2. Фильтр Encrypt
8.6.4. Фильтры, управляющие строковыми данными
8.6.4.1. Фильтр StringToLower
8.6.4.2. Фильтр PregReplace
8.6.4.3. Фильтр StripTags
8.6.4.4. Фильтр StripNewlines
8.6.4.5. Фильтр UriNormalize
8.6.5. Организация фильтров в цепь
8.6.6. Пользовательская фильтрация с помощью фильтра Callback
8.6.6.1. Пример
8.7. Написание своего собственного фильтра
8.7.1. Использование класса PhoneFilter
8.8. Выводы
9. Проверка входных данных с помощью валидаторов
9.1. О валидаторах
9.1.1. ValidatorInterface
9.2. Обзор стандартных валидаторов
9.3. Поведение валидаторов в случае недействительных или недопустимых данных
9.4. Инстанцирование валидатора
9.4.1. Способ 1: Инстанцирование валидатора вручную
9.4.2. Способ 2. Использование обертки StaticValidator
9.4.3. Способ 3. Использование описания в виде массива
9.5. О менеджере плагинов валидаторов
9.6. Примеры использования валидаторов
9.6.1. Валидаторы для проверки соответствия значения определенному формату
9.6.1.1. Ip Validator
9.6.1.2. Hostname Validator
9.6.1.3. Валидатор Uri
9.6.1.4. Валидатор Date
9.6.1.5. Валидатор Regex
9.6.2. Валидаторы для проверки того, что числовое значение лежит в заданном диапазоне
9.6.2.1. Валидатор NotEmpty
9.6.2.2. Валидатор Between
9.6.2.3. Валидатор InArray
9.6.2.4. Валидатор StringLength
9.6.3. Организация валидаторов в цепь
9.6.4. Пользовательская валидация с помощью валидатора Callback
9.6.4.1. Пример
9.7. Написание своего валидатора
9.7.1. Использование класса PhoneValidator
9.8. Использование фильтров и валидаторов вне форм
9.9. Выводы
10. Выгрузка файлов на сервер с помощью форм
10.1. О выгрузке файлов на сервер по протоколу HTTP
10.1.1. Бинарное транспортное кодирование HTTP
10.1.2. Суперглобальный массив $_FILES в PHP
10.2. Доступ к выгруженным на сервер файлам в ZF3
10.3. Выгрузка файлов на сервер и модель формы ZF3
10.4. Валидация выгруженных на сервер файлов
10.5. Фильтрация выгружаемых на сервер файлов
10.6. Контейнер InputFilter и выгрузка файлов на сервер
10.6.1. FileInput
10.6.2. Выполнение валидаторов перед фильтрами
10.7. Действие контроллера и выгрузка файлов на сервер
10.8. Пример: Image Gallery
10.8.1. Добавление модели FormModel
10.8.2. Добавление правил валидации к модели ImageForm
10.8.3. Написание сервиса ImageManager
10.8.4. Добавление ImageController
10.8.4.1. Добавление действия выгрузки и соответствующего шаблона представления
10.8.4.2. Добавление index действия и соответствующего шаблона представления
10.8.4.3. Добавление действия file
10.8.4.4. Создание фабрики для контроллера
10.8.4.5. Регистрация ImageController
10.8.4.6. Создание маршрута
10.8.5. Результаты
10.9. Выводы
11. Продвинутое использование форм
11.1. Элементы безопасности форм
11.1.1. CAPTCHA
11.1.1.1. Типы CAPTCHA
11.1.1.2. Элемент формы CAPTCHA и помощник вида
11.1.1.3. Пример 1: Добавление CAPTCHA типа Image к ContactForm
11.1.1.4. Пример 2: Добавление CAPTCHA типа FIGlet к ContactForm
11.1.2. Предотвращение подделки межсайтовых запросов (CSRF)
11.1.2.1. Пример: добавление к форме элемента CSRF
11.2. Использование групп валидации
11.3. Реализация многошаговых (Multi-Step) форм
11.3.1. Включение сессий
11.3.2. Добавление RegistrationForm
11.3.3. Добавление RegistrationController
11.3.3.1. Добавление RegistrationControllerFactory
11.3.4. Добавление шаблонов представлений
11.3.5. Добавление маршрута
11.3.6. Результаты
11.4. Выводы
12. Управление базой данных с помощью ORM Doctrine
12.1. Загрузка примера Blog с GitHub
12.2. Создание простой базы данных MySQL
12.2.1. Создание новой базы данных
12.2.2. Создание таблиц
12.2.3. Импорт готовой схемы базы данных
12.3. Интеграция ORM Doctrine и Zend Framework 3
12.3.1. Установка компонентов Doctrine с помощью Composer
12.3.2. Загрузка модулей интеграции Doctrine при запуске приложения
12.3.3. Обзор конфигурации Doctrine
12.3.4. Переопределение настройки Doctrine по умолчанию
12.4. Указание параметров подключения к базе данных
12.5. О сущностях Doctrine
12.5.1. Аннотации
12.6. Создание сущностей
12.6.1. Добавление сущности Post
12.6.2. Добавление сущностей Comment и Tag
12.6.3. Определение отношений между сущностями
12.6.3.1. «Один-ко-многим» и «многие-к-одному»
12.6.3.2. «Многие-ко-многим»
12.6.4. Указание местонахождений сущностей
12.7. О менеджере сущностей
12.7.1. Репозитории сущностей
12.8. Добавление главной страницы блога
12.9. Добавление нового поста
12.9.1. Добавление PostForm
12.9.2. Добавление сервиса PostManager
12.9.3. Создание действия контроллера и шаблона представления
12.10. Изменение существующего поста
12.10.1. Изменение PostManager
12.10.2. Добавление действия контроллера и шаблона представления
12.11. Удаление поста
12.11.1. Изменение PostManager
12.11.2. Добавление действия контроллера
12.12. Реализация просмотра поста
12.12.1. Добавление CommentForm
12.12.2. Изменение PostManager
12.12.3. Добавление действия контроллера и шаблона представления
12.13. Реализация страницы администратора
12.14. Реализация облака тегов
12.14.1. Добавление пользовательского репозитория постов
12.14.2. Вычисление облака тегов
12.14.3. Изменение действия контроллера
12.14.4. Визуализация облака тегов
12.15. Пагинация (Pagination)
12.15.1. Пагинатор из Doctrine ORM
12.15.2. ZF3 Paginator
12.15.2.1. Модифицируем PostRepository
12.15.2.2. Модифицируем IndexController
12.15.2.3. Визуализация виджета пагинатора
12.15.2.4. Результаты
12.16. Выводы
13. Миграции баз данных
13.1. Установка компонента Doctrine\Migrations
13.2. Настройка миграций
13.3. Создание миграций
13.3.1. Создание начальной миграции
13.3.2. Добавление еще одной миграции
13.4. Выполнение миграций
13.5. Выводы
14. Создание нового модуля
14.1. Когда создавать новый модуль?
14.2. Как создать новый модуль?
14.2.1. Переименование скелетного модуля
14.2.2. Включение автозагрузки классов
14.2.3. Включение модуля
14.3. Файл Module.php и обработка событий
14.3.1. Пример 1. Переключение шаблона лэйаута
14.3.2. Пример 2. Использование HTTPS
14.3.3. Пример 3. Сообщения об исключениях на веб-сайте
14.4. Регистрация модуля в качестве пакета Composer'a
14.5. Выводы
15. Работа с сессиями
15.1. Сессии PHP
15.2. Установка компонента Zend\Session
15.3. Менеджер сессий
15.3.1. Определение конфигурации сессии
15.3.2. Делаем менеджер сессий выбираемым по умолчанию
15.4. Контейнеры сессий
15.4.1. Способ 1. Инстанцирование контейнера сессий вручную
15.4.2. Способ 2. Создание контейнера сессий с использованием фабрики
15.4.3. Сохранение данных в сессию с помощью контейнера сессий
15.5. Выводы
16. Управление пользователями и аутентификация
16.1. Загрузка примера User Demo с GitHub
16.2. Создание модуля User
16.3. Создание базы данных
16.4. Реализация сущности User
16.5. Добавление UserController
16.6. Добавление сервиса UserManager
16.6.1. Создание нового пользователя и хранение пароля в зашифрованном виде
16.6.2. Валидация зашифрованного пароля
16.6.3. Создание пользователя Admin
16.6.4. Сброс пароля пользователя
16.7. Реализация аутентификации пользователя
16.7.1. AuthenticationService
16.7.2. Написание адаптера аутентификации
16.7.3. Создание фабрики для AuthenticationService
16.7.4. Добавление AuthController
16.7.5. Добавление шаблона представления для страницы Login
16.7.6. Добавление сервиса AuthManager
16.8. Фильтрация доступа
16.8.1. Добавление обработчика события Dispatch
16.8.2. Реализация алгоритма фильтрации доступа
16.8.3. Тестирование фильтра доступа
16.9. Плагин контроллера Identity и помощник представления Identity
16.10. Выводы
17. Контроль доступа на основе ролей
17.1. Загрузка примера Role Demo с GitHub
17.2. Введение в RBAC
17.2.1. Роли и привилегии
17.2.2. Контейнер RBAC
17.2.3. Проверка привилегий
17.3. Роли по умолчанию в примере Role Demo
17.4. Введение в динамические утверждения
17.5. Создание базы данных
17.6. Создание сущностей
17.7. Управление ролями
17.8. Управление привилегиями
17.9. Назначение ролей пользователю
17.10. Реализация RbacManager
17.10.1. Настройка кеширования
17.10.2. Пишем сервис RbacManager
17.11. Добавление страницы Not Authorized
17.12. Модифицируем сервис AuthManager
17.13. Модифицируем обработчик события Dispatch
17.14. Добавляем плагин контроллера Access и помощник представления
17.14.1. Плагин контроллера Access
17.14.2. Помощник представления Access
17.15. Использование модуля User
17.16. Выводы
Приложение A. Настройка среды веб разработки
Установка Apache, PHP и MySQL в Linux
Установка Apache и PHP
Проверка установки веб-сервера
Редактирование конфигурации PHP
Перезапуск Apache Web Server
Включение модуля mod_rewrite
Создание виртуального хоста Apache
Установка PHP-расширения XDebug
Установка сервера баз данных MySQL
Настройка сервера БД MySQL
Установка Apache, PHP и MySQL в Windows
Проверка установки веб-сервера
Включение модуля mod_rewrite
Создание виртуального хоста Apache
Установка PHP-расширения XDebug
Настройка сервера БД MySQL
Установка NetBeans IDE в Linux
Установка NetBeans IDE в Windows
Выводы
Приложение Б. Введение в PHP-разработку в NetBeans IDE
Конфигурация запуска
Запуск веб-сайта
Отладка сайта в NetBeans
Панель инструментов отладки
Точки останова
Наблюдение за переменными
Стек вызовов
Параметры отладки
Профилирование
Выводы
Приложение В. Введение в Twitter Bootstrap
Обзор файлов Bootstrap
Система сеток
Задание сетки
Смещение столбцов
Вложенные сетки
Концепция "Mobile First"
Компоненты интерфейса Bootstrap
Панель навигации
Выпадающее меню
Сжимающаяся панель навигации
Обратный стиль навигационной панели
Навигационные цепочки
Пагинация
Кнопки и глиф-иконки
Кастомизация Bootstrap
Выводы
Приложение Г. Введение в Doctrine
Doctrine и системы управления базами данных
Реляционные базы данных
SQL против DQL
NoSQL БД
Документо-ориентированные базы данных
Архитектура Doctrine
Компоненты, поддерживающие реляционные базы данных
Компоненты, поддерживающие документоориентированные NoSQL-БД
Выводы
Приложение Д. Установка веб-приложения на Amazon EC2
Что такое Amazon Web Services?
Создание аккаунта Amazon Web Services
Создание ключевой пары
Запуск инстанса EC2
Шаг 1 – Выберите образ машины Amazon
Шаг 2 — Выберите тип инстанса
Шаг 3 - Настройте инстанс
Шаг 4 - Добавьте хранилище
Шаг 5 — Добавьте к инстансу теги
Шаг 6 — Группа безопасности
Шаг 7 — Проверьте инстанс перед запуском
Присвоение IP-адреса инстансу
Подключение к инстансу EC2 через SSH
Установка HTTP-сервера Apache и PHP-движка
Установка веб-приложения Hello World
Создание виртуального хоста
Установка Zend Framework 3 с помощью Composer
Результаты
Выводы
Top