От переводчика
Предисловие
Введение
- Благодарности
- Кому предназначена эта книга
- Соглашения
- Обзор содержания книги
I От запроса до ответа
- HttpKernelInterface
- Окружение
- Режим отладки
- Загрузка ядра
- Бандлы и расширения контейнера
- Создание сервисного контейнера
- От Kernel до HttpKernel
- События, приводящие к ответу
- Ранний ответ
- Регистрация слушателей событий (event listeners)
- Слушатели kernel.request, о которых вам нужно знать
- Определение контроллера для запуска
- … вот это всё, что может быть контроллером
- Возможность замены контроллера
- Распространение событий (event propagation)
- Примечательные слушатели события kernel.controller
- Преобразователи параметров (Param converters)
- Сбор аргументов для выполнения контроллера
- Выполнение контроллера
- Вход в слой представления (view)
- Примечательные слушатели события kernel.view
- Фильтрация ответа
- Примечательные слушатели события kernel.response
- Обработка исключений
- Примечательные слушатели события kernel.exception
- Подзапросы
- Когда используются подзапросы?
- Когда вы пишете собственный слушатель событий ядра…
II Приёмы внедрения зависимостей
- Что такое бандл (bundle)
- Не используйте команды генерации
- Приёмы создания сервисов
- Обязательные зависимости
- Обязательные параметры конструктора
- Абстрактные определения для дополнительных аргументов
- Наследование свойств
- Вызов обязательных set-методов (setters)
- ContainerAware
- Вызов методов в абстрактных сервисах
- Соглашение об именовании родительских сервисов
- Необязательные (опциональные) зависимости
- Необязательные аргументы конструктора
- Проверка необязательных зависимостей
- Необязательные вызовы set-методов
- Определение закрытых (non-public) зависимостей
- Коллекции сервисов
- Вызов нескольких методов
- Лучшее из двух миров
- Метки сервисов (tags)
- Вызов одного метода
- Замена аргумента конструктора
- Передаём ID сервисов вместо референсов
- Делегирование создания
- Не очень полезно…
- Иногда всё-таки полезно…
- Создание сервисов вручную
- Определение
- Аргументы
- Таги
- Алиасы (псевдонимы)
- Класс Configuration
- Учимся составлять замечательные деревья конфигураций
- Динамическое добавление тагов
- Используем паттерн Стратегия для загрузки сервисов
- Загрузка и конфигурирование дополнительных сервисов
- Подчищаем класс конфигурации
- Конфигурируем сервис, который будем использовать
- Полностью динамическое определение сервисов
- Приёмы создания параметров
- Файл parameters.yml
- Определение и загрузка параметров
- Параметры для имени класса
- Сборка значений параметров вручную
- Параметры ядра
- Определяем параметры в расширениях контейнера
- Переопределение параметров при помощи компилятора (compiler pass)
- Валидация определений сервисов
III Структура проекта
- Организация слоёв приложения
- Тонкие контроллеры
- Обработчики форм
- Доменные менеджеры
- События
- Лучшие практики использования слушаетелей событий
- События уровня хранения (persistence)
- Подводные камни событий Doctrine
- Состояния и контекст
- Контекст безопасности
- @dbykadorov: ВАЖНО! Отличия в версиях 2.6 и страше
- Текущий пользователь
- Запрос
- @dbykadorov: ВАЖНО! Отличия в версиях 2.8 и страше
- Избегаем зависимостей от текущего запроса
- Используем слушатель (event listener)
- Предоставлять объект запроса во время выполнения
- Поиск совпадений для запросов (request matcher)
- Использование только нужных значений
IV Соглашения по конфигурированию
- Настройка конфигурации приложения
- Локальные конфигурационные файлы
- Храните parameters.yml
- @dbykadorov:
- Добавьте default_parameters.yml
- Заключение
- Соглашения по конфигурированию
- Сделалв выбор, не меняйте его
- Маршрутизатор
- Правила именования маршрутов
- Сервисы
- Метаданные Doctrine
- Рекомендуемые соглашения
V Безопасность
- Введение
- Symfony и безопасность
- Цели: предотвращение и ограничение
- Минимизация урона
- Оценка мер по обеспечению безопасности
- Перед тем как мы начнём…
- Аутентификация и сессии
- Инвалидация сессии
- Угон сесии
- Долгоиграющие сессии
- Журналирование информации, относящейся к безопасности
- Дизайн контроллеров
- Защи та действий в контроллерах
- Размещение контроллеров за файрволлом
- Валидация входных данных
- Безопасные формы
- HTML5-валидация
- Ограничения валидатора
- Пользовательские ограничения валидации
- Формы без сущности
- Валидация значений из запроса
- Атрибуты запроса
- Параметры маршрута
- Query (GET) и request (POST) параметры
- Не используйте $request->get()!
- Используем ParamFetcher
- Очистк а HTML
- Автоматизация очистки
- Экранирование вывода
- Twig
- Контекст экранирования
- Экранирование вывода функций
- Экранирование аргументов функций
- Опасности raw фильтра
- Проверка безопасности Twig
- Быть скрытным
- Маскируйте ошибки аутентификации
- Предотвращайте отображение исключений
- Настройте страницы ошибок
- Не сообщайте ничего определённого о конфиденциальных данных
- @dbykadorov: будьте параноиком
VI Используем аннотации
- Введение
- Аннотации: Предметно-ориентированные языки
- Аннотация - это простой Объект-Значение (Value Object)
- Добавляем аттрибуты к вашим аннотациям
- Передача атрибутов через конструктор
- Заполнение публичных свойств указанными атрибутами
- Валидация при помощи @Attributes
- Валидация при помощи аннотаций @var и @Required
- Ограничения на использование аннотации
- Когда стоит использ овать аннотации
- Загрузка конфигураций
- Аннотации и связность кода
- Контроль процесса выполнения приложения
- Используем аннотации в вашем Symfony-приложении
- Реагируем на атрибуты запроса (Request): аннотация @Referrer
- Не забывайте о проблемах безопасности
- Аннотации должны быть закешированы
- Предотвращаем выполнение контроллера: аннотация @RequiresCredits
- Модифицируем ответ: аннотация @DownloadAs
- Проектирование для повторого использования
- Заключение
VII Быть Symfony разработчиком
- Повторно используемый код должен иметь слабую связность
- Разделяйте код копании от кода продукта
- Связность между кодом компании и приложения
- Разделяйте код на “библиотечный” и “бандловый”
- Примеры библиотечного и бандлового кода
- Уменьшайте связность с фреймворком
- Слушатели событий (listeners) вместо подписчиков (subscribers)
- Аргументы конструктора вместо получения параметров из контейнера
- Аргументы конструктора вместо получения сервисов из контейнера
- О производительности
- Контроллеры, не зависящие от фреймворка
- Тонкие команды
- Окружение
- Повторно используемый код должен быть легко переносимым
- Управление зависимостями и контроль версий
- Репозитории пакетов
- Жесткая привязка к хранилищу (базе данных)
- Сущности с автоматическим сопоставлением (auto-mapped)
- Модели, не привязанные к хранилищу
- Классы моделей являются библиотечным кодом (фактически)
- Менеджеры объектов
- Жесткая привязка к файловой системе
- Использование файловой системы
- Повторно используемый код должен быть открыт для расширения
- Настраиваемое поведение
- Все должно быть заменяемым
- Много маленьких классов, много отдельных обязанностей
- Используйте интерфейсы
- Согласованные интерфейсы
- Используйте конфигурацию бандла для замены сервисов
- Добавляйте точки расширения
- Метки (таги) сервисов
- События
- Повторно используемый код должен быть лёгок в использовании
- Добавьте документаци ю
- Документация для внутренних проектов
- Создавайте полезные исключения
- Используйте специальные классы исключений
- Указывайте детальные и понятные сообщения
- Повторно используемый код должен быть надёжным
- Добавляйте достаточное количество тестов
- Используйте упрощенный контейнер сервисов для интеграционных тестов
- Тестируйте классы расширения и конфигурации вашего бандла
- Массивы конфигурации
- Используйте библиотеку SymfonyDependencyInjectionTest
- Используйте библиотеку SymfonyConfigTest
Заключение
- Заключение от переводчика
