• Название:

    A year with symfony ru (1)


  • Размер: 5.09 Мб
  • Формат: PDF
  • или
  • Сообщить о нарушении / Abuse

Установите безопасный браузер



  • Название: Один год с Symfony
  • Автор: Dmitry Bykadorov и Matthias Noback

Предпросмотр документа

Один год с Symfony
Перевод книги “A year with Symfony” от Matthias Noback
Dmitry Bykadorov и Matthias Noback
Эта книга предназначена для продажи на http://leanpub.com/a-year-with-symfony-ru
Эта версия была опубликована на 2016-11-30

Это книга с Leanpub book. Leanpub позволяет авторам и издателям участвовать в так
называемом Lean Publishing - процессе, при котором электронная книга становится
доступна читателям ещё до её завершения. Это помогает собрать отзывы и пожелания для
скорейшего улучшения книги. Мы призываем авторов публиковать свои работы как
можно раньше и чаще, постепенно улучшая качество и объём материала. Тем более, что с
нашими удобными инструментами этот процесс превращается в удовольствие.
© 2016 Dmitry Bykadorov и Matthias Noback

Оглавление
От переводчика . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

1

Предисловие . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2

Введение . . . . . . . . . . . . . . .
Благодарности . . . . . . . . . .
Кому предназначена эта книга .
Соглашения . . . . . . . . . . . .
Обзор содержания книги . . . .

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

4
5
6
7
8

I От запроса до ответа . . . . . . . . . . . . . . . . . . . . . . . .
1 HttpKernelInterface . . . . . . . . . . . . . . . . . . . . . . . .
1.1 Загрузка ядра . . . . . . . . . . . . . . . . . . . . . . . .
1.2 От Kernel до HttpKernel . . . . . . . . . . . . . . . . . .
2 События, приводящие к ответу . . . . . . . . . . . . . . . .
2.1 Ранний ответ . . . . . . . . . . . . . . . . . . . . . . . .
2.2 Определение контроллера для запуска . . . . . . . . .
2.3 Возможность замены контроллера . . . . . . . . . . .
2.4 Сбор аргументов для выполнения контроллера . . . .
2.5 Выполнение контроллера . . . . . . . . . . . . . . . . .
2.6 Вход в слой представления (view) . . . . . . . . . . . .
2.7 Фильтрация ответа . . . . . . . . . . . . . . . . . . . . .
3 Обработка исключений . . . . . . . . . . . . . . . . . . . . .
3.1 Примечательные слушатели события kernel.exception
4 Подзапросы . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.1 Когда используются подзапросы? . . . . . . . . . . . .

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

10
11
12
15
17
17
19
21
22
23
24
26
28
29
31
31

II Приёмы внедрения зависимостей . . . . . . . . . . .
5 Что такое бандл (bundle) . . . . . . . . . . . . . . . .
6 Приёмы создания сервисов . . . . . . . . . . . . . . .
6.1 Обязательные зависимости . . . . . . . . . . . .
6.2 Необязательные (опциональные) зависимости
6.3 Коллекции сервисов . . . . . . . . . . . . . . . .
6.4 Делегирование создания . . . . . . . . . . . . .
6.5 Создание сервисов вручную . . . . . . . . . . .
6.6 Класс Configuration . . . . . . . . . . . . . . . . .
6.7 Динамическое добавление тагов . . . . . . . . .

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

33
34
35
35
39
41
48
50
52
54

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

ОГЛАВЛЕНИЕ

6.8 Используем паттерн Стратегия для загрузки сервисов . . . . . . . . . . .
6.9 Загрузка и конфигурирование дополнительных сервисов . . . . . . . . .
6.10 Настраиваем какой сервис использовать . . . . . . . . . . . . . . . . . .
6.11 Полностью динамическое определение сервисов . . . . . . . . . . . . .
7 Приёмы создания параметров . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7.1 Файл parameters.yml . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7.2 Определение и загрузка параметров . . . . . . . . . . . . . . . . . . . . .
7.3 Определяем параметры в расширениях контейнера . . . . . . . . . . . .
7.4 Переопределение параметров при помощи компилятора (compiler pass)
III Структура проекта . . . . . . . . .
8 Организация слоёв приложения
8.1 Тонкие контроллеры . . . .
8.2 Обработчики форм . . . . .
8.3 Доменные менеджеры . . .
8.4 События . . . . . . . . . . .
Состояния и контекст . . . . . . .
9.1 Контекст безопасности . .
9.2 Запрос . . . . . . . . . . . .

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

56
58
60
62
64
64
65
68
69

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

71
72
72
73
75
77
83
83
86

IV Соглашения по конфигурированию . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
Настройка конфигурации приложения . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
Соглашения по конфигурированию . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
V Безопасность . . . . . . . . . . .
Введение . . . . . . . . . . . . .
Аутентификация и сессии . . .
Проектирование контроллеров
Проверка ввода . . . . . . . . . .
Экранирование вывода . . . . .
Будучи скрытным… . . . . . . .

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

. 94
. 95
. 96
. 97
. 98
. 99
. 100

VI Используем аннотации . . . . . . . . . . . . . . . . . . .
Введение . . . . . . . . . . . . . . . . . . . . . . . . . . .
Аннотация - это лишь Value Object . . . . . . . . . . . .
Приемлемые случаи для использования аннотаций . .
Используем аннотации в вашем Symfony приложении
Проектирование для повторного использования . . . .
Заключение . . . . . . . . . . . . . . . . . . . . . . . . . .

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

. 101
. 102
. 103
. 104
. 105
. 106
. 107

VII Быть Symfony разработчиком . . . . . . . . . . . . . . . . . . . . . . . . .
Код для повторного использования имеет слабые связи . . . . . . . . . . .
Код для повторного использования должен быть переносимым . . . . . .
Код для повторного использования должен быть расширяемым . . . . . .
Код для повторного использования должен быть прост в использовании
Код для повторного использования должен быть надёжен . . . . . . . . .

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

. 108
. 109
. 110
. 111
. 112
. 113

ОГЛАВЛЕНИЕ

Заключение . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114

От переводчика
Книгу “Один год с Symfony” написал разработчик из Голландии - Matthias Noback. Книга в
английском варианте доступна на сайте leanpub.
Маттиас, по завершению работы над книгой, сделал её доступной бесплатно, так что вы
можете обратиться к первоисточнику. Сам же я об этой книге я узнал случайно, из какой-то
рассылки, как раз когда она стала бесплатной. Да, она про Symfony2, но она описывает и
более общиее принципы разработки нежели просто версию одного фреймворка, так что я
полагаю, что эта книга еще долго будет актуальна. Во всяком случае для тех, кто использует
Symfony3 она также “must read”.
Касательно перевода: некоторые фразы и конструкции я перевел, как мне кажется, в более
литературном виде. Некоторые, привычные разрабочикам термины, я не стал переводить
и просто транслитерировал, например: фреймворк, бандл. Имена же, наоборот, оставил без
перевода на случай, если вы захотите загуглить - кто же это такой. Небольшие соглашения
по наименованиям:





framework - фреймворк;
bundle - бандл;
controller - контроллер;
router (route) - маршрутизатор (маршрут)

Мои примечания будут расположены в тексте в таком виде: (@dbykadorov: текст примечания). Если же примечание будет большое, это будет отдельный абзац, начинающийся
с @dbykadorov. Также я намерен проверять все примеры на Symfony 3.2, так что, если
будут какие-то расхождения в работе ныне актуальной версии Symfony с той, которую
использовал Маттиас (2.3) - я укажу на это и предложу также вариант для 3.2.
Если у вас есть предложение как улучшить перевод - пишите мне или делайте pull-request.
Я надеюсь, перевод и книга вам поравятся.
Happy coding!
Dmitry Bykadorov

1

Предисловие
От Luis Cordova
Большинство open source проектов имеют свою историю и серьёзные основания для их
появления и развития. PHP фреймворк Symfony2 (а теперь и 3) активно развивается посление несколько лет. Многие разработчики, попробовав использовать этот фреймфорк,
испытывали и испытывают сложности, разбираясь в нюансах его функционирования. И,
хотя большинство из них так или иначе преодолевают все трудности, в конце концов у них
остаётся много сомнений, касательно того как же всё-таки правильно разрабатывать в стиле
Symfony.
У Symfony1 основной документацией была книга, котороя освещала основые особенности
и практики в использовании этого фреймворка. У Symfony2 также есть книга, которая является основной документацией для него (@dbykadorov: на начало августа 2