4
4
5
5
use DI \Bridge \Silex \Container \ContainerInteropProxy ;
6
6
use DI \Bridge \Silex \Controller \ControllerResolver ;
7
+ use DI \Bridge \Silex \MiddlewareListener ;
8
+ use DI \Bridge \Silex \ConverterListener ;
9
+ use Silex \EventListener \LocaleListener ;
10
+ use Silex \EventListener \StringToResponseListener ;
11
+ use Silex \LazyUrlMatcher ;
12
+ use Symfony \Component \HttpKernel \Kernel ;
13
+ use Symfony \Component \HttpKernel \HttpKernelInterface ;
14
+ use Symfony \Component \HttpKernel \KernelEvents ;
15
+ use Symfony \Component \HttpKernel \Event \GetResponseEvent ;
16
+ use Symfony \Component \HttpKernel \Event \FilterResponseEvent ;
17
+ use Symfony \Component \HttpKernel \Event \PostResponseEvent ;
18
+ use Symfony \Component \HttpKernel \EventListener \ResponseListener ;
19
+ use Symfony \Component \HttpKernel \EventListener \RouterListener ;
7
20
use DI \Container ;
8
21
use DI \ContainerBuilder ;
9
22
use Interop \Container \ContainerInterface ;
10
23
use Invoker \CallableResolver ;
24
+ use Invoker \Reflection \CallableReflection ;
11
25
use Invoker \ParameterResolver \AssociativeArrayResolver ;
12
26
use Invoker \ParameterResolver \Container \TypeHintContainerResolver ;
13
27
use Invoker \ParameterResolver \ResolverChain ;
@@ -29,6 +43,11 @@ class Application extends \Silex\Application
29
43
*/
30
44
private $ phpdi ;
31
45
46
+ /**
47
+ * @var CallbackInvoker
48
+ */
49
+ private $ callbackInvoker ;
50
+
32
51
/**
33
52
* @param ContainerBuilder|null $containerBuilder You can optionally provide your preconfigured container builder.
34
53
* @param array $values
@@ -45,6 +64,7 @@ public function __construct(ContainerBuilder $containerBuilder = null, array $va
45
64
]);
46
65
$ containerBuilder ->wrapContainer ($ this ->containerInteropProxy );
47
66
$ this ->phpdi = $ containerBuilder ->build ();
67
+ $ this ->callbackInvoker = new CallbackInvoker ($ this ->containerInteropProxy );
48
68
49
69
parent ::__construct ($ values );
50
70
@@ -70,6 +90,33 @@ public function __construct(ContainerBuilder $containerBuilder = null, array $va
70
90
$ this ['phpdi.callable_resolver ' ]
71
91
);
72
92
});
93
+
94
+ // Override the dispatcher with ours to use our event listeners
95
+ $ this ['dispatcher ' ] = $ this ->share (function () {
96
+ /**
97
+ * @var EventDispatcherInterface
98
+ */
99
+ $ dispatcher = new $ this ['dispatcher_class ' ]();
100
+
101
+ $ urlMatcher = new LazyUrlMatcher (function () {
102
+ return $ this ['url_matcher ' ];
103
+ });
104
+ if (Kernel::VERSION_ID >= 20800 ) {
105
+ $ dispatcher ->addSubscriber (new RouterListener ($ urlMatcher , $ this ['request_stack ' ], $ this ['request_context ' ], $ this ['logger ' ]));
106
+ } else {
107
+ $ dispatcher ->addSubscriber (new RouterListener ($ urlMatcher , $ this ['request_context ' ], $ this ['logger ' ], $ this ['request_stack ' ]));
108
+ }
109
+ $ dispatcher ->addSubscriber (new LocaleListener ($ this , $ urlMatcher , $ this ['request_stack ' ]));
110
+ if (isset ($ this ['exception_handler ' ])) {
111
+ $ dispatcher ->addSubscriber ($ this ['exception_handler ' ]);
112
+ }
113
+ $ dispatcher ->addSubscriber (new ResponseListener ($ this ['charset ' ]));
114
+ $ dispatcher ->addSubscriber (new MiddlewareListener ($ this , $ this ->callbackInvoker ));
115
+ $ dispatcher ->addSubscriber (new ConverterListener ($ this ['routes ' ], $ this ['callback_resolver ' ], $ this ->callbackInvoker ));
116
+ $ dispatcher ->addSubscriber (new StringToResponseListener ());
117
+
118
+ return $ dispatcher ;
119
+ });
73
120
}
74
121
75
122
public function offsetGet ($ id )
@@ -100,4 +147,83 @@ public function getPhpDi()
100
147
{
101
148
return $ this ->phpdi ;
102
149
}
150
+
151
+ public function before ($ callback , $ priority = 0 )
152
+ {
153
+ $ this ->on (KernelEvents::REQUEST , function (GetResponseEvent $ event ) use ($ callback ) {
154
+ if (HttpKernelInterface::MASTER_REQUEST !== $ event ->getRequestType ()) {
155
+ return ;
156
+ }
157
+
158
+ $ request = $ event ->getRequest ();
159
+ $ middleware = $ this ['callback_resolver ' ]->resolveCallback ($ callback );
160
+ $ ret = $ this ->callbackInvoker ->call ($ middleware , [
161
+ // type hints
162
+ 'Symfony\Component\HttpFoundation\Request ' => $ request ,
163
+ // Silex' default parameter order
164
+ 0 => $ request ,
165
+ 1 => $ this ,
166
+ ]);
167
+
168
+ if ($ ret instanceof Response) {
169
+ $ event ->setResponse ($ ret );
170
+ }
171
+
172
+ }, $ priority );
173
+ }
174
+
175
+ public function after ($ callback , $ priority = 0 )
176
+ {
177
+ $ this ->on (KernelEvents::RESPONSE , function (FilterResponseEvent $ event ) use ($ callback ) {
178
+ if (HttpKernelInterface::MASTER_REQUEST !== $ event ->getRequestType ()) {
179
+ return ;
180
+ }
181
+
182
+ $ request = $ event ->getRequest ();
183
+ $ response = $ event ->getResponse ();
184
+ $ middleware = $ this ['callback_resolver ' ]->resolveCallback ($ callback );
185
+ $ ret = $ this ->callbackInvoker ->call ($ middleware , [
186
+ // type hints
187
+ 'Symfony\Component\HttpFoundation\Request ' => $ request ,
188
+ 'Symfony\Component\HttpFoundation\Response ' => $ response ,
189
+ // Silex' default parameter order
190
+ 0 => $ request ,
191
+ 1 => $ response ,
192
+ 2 => $ this ,
193
+ ]);
194
+
195
+ if ($ ret instanceof Response) {
196
+ $ event ->setResponse ($ ret );
197
+ } elseif (null !== $ ret ) {
198
+ throw new \RuntimeException ('An after middleware returned an invalid response value. Must return null or an instance of Response. ' );
199
+ }
200
+
201
+ }, $ priority );
202
+ }
203
+
204
+ public function finish ($ callback , $ priority = 0 )
205
+ {
206
+ $ this ->on (KernelEvents::TERMINATE , function (PostResponseEvent $ event ) use ($ callback ) {
207
+
208
+ $ request = $ event ->getRequest ();
209
+ $ response = $ event ->getResponse ();
210
+ $ middleware = $ this ['callback_resolver ' ]->resolveCallback ($ callback );
211
+ $ ret = $ this ->callbackInvoker ->call ($ middleware , [
212
+ // type hints
213
+ 'Symfony\Component\HttpFoundation\Request ' => $ request ,
214
+ 'Symfony\Component\HttpFoundation\Response ' => $ response ,
215
+ // Silex' default parameter order
216
+ 0 => $ request ,
217
+ 1 => $ response ,
218
+ 2 => $ this ,
219
+ ]);
220
+
221
+ if ($ ret instanceof Response) {
222
+ $ event ->setResponse ($ ret );
223
+ } elseif (null !== $ ret ) {
224
+ throw new \RuntimeException ('An after middleware returned an invalid response value. Must return null or an instance of Response. ' );
225
+ }
226
+
227
+ }, $ priority );
228
+ }
103
229
}
0 commit comments