• Название: A Year With Symfony
  • Автор: Matthias Noback

A Year With Symfony
Writing healthy, reusable Symfony2 code
Matthias Noback
This book is for sale at http://leanpub.com/a-year-with-symfony
This version was published on 2014-04-16

This is a Leanpub book. Leanpub empowers authors and publishers with the Lean Publishing
process. Lean Publishing is the act of publishing an in-progress ebook using lightweight tools and
many iterations to get reader feedback, pivot until you have the right book and build traction once
you do.
©2013 - 2014 Matthias Noback

To Liesbeth and Lucas, because this is… Life

Contents
Foreword . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

i

Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

ii

Thank you . . . . . . . . .
Who should read this book
Conventions . . . . . . . .
Overview of the contents .

I

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

ii
iii
iii
iii

The journey from request to response . . . . . . . . . . . . . . . . . . . . . . .

1

1 The HttpKernelInterface . . . . . . . .
1.1 Booting the kernel . . . . . . . . . .
Bundles as container extensions . . .
Creating the service container . . . .
1.2 From the Kernel to the HttpKernel

.
.
.
.

.
.
.
.
.

.
.
.
.

.
.
.
.
.

.
.
.
.

.
.
.
.
.

.
.
.
.

.
.
.
.
.

.
.
.
.

.
.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

2
4
4
6
7

2 Events leading to a response . . . . . . . . . . . .
2.1 Early response . . . . . . . . . . . . . . . . . .
Some notable kernel.request event listeners .
2.2 Resolving the controller . . . . . . . . . . . . .
2.3 Allow replacement of the controller . . . . . .
Some notable kernel.controller listeners . .
2.4 Collect arguments for executing the controller
2.5 Execute the controller . . . . . . . . . . . . . .
2.6 Enter the view layer . . . . . . . . . . . . . . .
A notable kernel.view listener . . . . . . . . .
2.7 Filter the response . . . . . . . . . . . . . . . .
Notable kernel.response listeners . . . . . . .

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

9
9
11
13
14
15
16
17
18
20
20
21

3 Exception handling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.1 Notable kernel.exception listeners . . . . . . . . . . . . . . . . . . . . . . . . . . .

22
24

4 Sub-requests . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.1 When are sub-requests used? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

25
25

CONTENTS

II Patterns of dependency injection . . . . . . . . . . . . . . . . . . . . . . . . . . 27
5 What is a bundle? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

28

6 Service patterns . . . . . . . . . . . . . . . . . . .
6.1 Required dependencies . . . . . . . . . . . . .
Required constructor arguments . . . . . . . .
Abstract definitions for extra arguments
Required setter calls . . . . . . . . . . . . . . .
Method calls in abstract definitions . . .
6.2 Optional dependencies . . . . . . . . . . . . .
Optional constructor arguments . . . . . . . .
Optional setter calls . . . . . . . . . . . . . . .
6.3 A collection of services . . . . . . . . . . . . .
Multiple method calls . . . . . . . . . . . . . .
The best of both worlds . . . . . . . . . . . . .
Service tags . . . . . . . . . . . . . . . . . . . .
Single method call . . . . . . . . . . . . . . . .
Replacing a single argument . . . . . . . . . .
Service ids instead of references . . . . . . . . .
6.4 Delegated creation . . . . . . . . . . . . . . .
Not so useful . . . . . . . . . . . . . . . . . . .
Sometimes useful . . . . . . . . . . . . . . . .
6.5 Manually creating services . . . . . . . . . . .
Definition . . . . . . . . . . . . . . . . . . . .
Arguments . . . . . . . . . . . . . . . . . . . .
Tags . . . . . . . . . . . . . . . . . . . . . . . .
Aliases . . . . . . . . . . . . . . . . . . . . . .
6.6 The Configuration class . . . . . . . . . . . .
6.7 Dynamically add tags . . . . . . . . . . . . . .
6.8 Strategy pattern for loading exclusive services
6.9 Loading and configuring additional services .
A cleaner configuration class . . . . . . . . . .
6.10 Configure which services to use . . . . . . . .
6.11 Completely dynamic service definitions . . . .

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

29
29
29
29
31
33
33
33
35
36
38
39
39
41
42
42
44
45
45
46
47
47
48
49
49
51
53
55
58
59
60

7 Parameter patterns . . . . . . . . . . . . . . . .
7.1 Parameters.yml . . . . . . . . . . . . . . .
7.2 Parameter resolving . . . . . . . . . . . . .
Parameters for class names . . . . . . . . .
Manually resolving parameters . . . . . . .
7.3 Define parameters in a container extension
7.4 Override parameters with a compiler pass .

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

64
64
65
66
66
68
70

.
.
.
.
.
.
.

.
.
.
.
.
.
.

CONTENTS

III Project structure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
8 Organizing application layers
8.1 Slim controllers . . . . . .
8.2 Form handlers . . . . . . .
8.3 Domain managers . . . . .
8.4 Events . . . . . . . . . . .
Persistence events . . . . .

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

73
73
75
77
80
83

9 State and context . . . . . . . . . . . . . . . . . . .
9.1 The security context . . . . . . . . . . . . . .
9.2 The request . . . . . . . . . . . . . . . . . . .
Avoiding a dependency on the current request .
Use an event listener . . . . . . . . . . .
Providing the request object at runtime .
Using specific values only . . . . . . . .

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.