@@ -43,10 +43,18 @@ component:
43
43
44
44
$ composer require symfony/http-kernel
45
45
46
- The HttpKernel component has many interesting features, but the one we need
47
- right now is the *controller resolver *. A controller resolver knows how to
48
- determine the controller to execute and the arguments to pass to it, based on
49
- a Request object. All controller resolvers implement the following interface::
46
+ The HttpKernel component has many interesting features, but the ones we need
47
+ right now are the *controller resolver * and *argument resolver *. A controller resolver knows how to
48
+ determine the controller to execute and the argument resolver determines the arguments to pass to it,
49
+ based on a Request object. All controller resolvers implement the following interface
50
+
51
+ .. caution ::
52
+
53
+ The `getArguments() ` method in the :class: `Symfony\\ Component\\ Httpkernel\\ Controller\\ ControllerResolver `
54
+ and respective interface :class: `Symfony\\ Component\\ Httpkernel\\ Controller\\ ControllerResolverInterface `
55
+ are deprecated as of 3.1 and will be removed in 4.0. You can use the
56
+ :class: `Symfony\\ Component\\ Httpkernel\\ Controller\\ ArgumentResolver ` which uses the
57
+ :class: `Symfony\\ Component\\ Httpkernel\\ Controller\\ ArgumentResolverInterface ` instead.::
50
58
51
59
namespace Symfony\C omponent\H ttpKernel\C ontroller;
52
60
@@ -58,6 +66,12 @@ a Request object. All controller resolvers implement the following interface::
58
66
function getArguments(Request $request, $controller);
59
67
}
60
68
69
+ // ...
70
+ interface ArgumentResolverInterface
71
+ {
72
+ function getArguments(Request $request, $controller);
73
+ }
74
+
61
75
The ``getController() `` method relies on the same convention as the one we
62
76
have defined earlier: the ``_controller `` request attribute must contain the
63
77
controller associated with the Request. Besides the built-in PHP callbacks,
@@ -74,10 +88,14 @@ resolver from HttpKernel::
74
88
75
89
use Symfony\Component\HttpKernel;
76
90
77
- $resolver = new HttpKernel\Controller\ControllerResolver();
91
+ $valueResolvers = [/* array of ArgumentValueResolverInterface implemetations */];
92
+ $argumentMetadataFactory = new Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadataFactory();
93
+
94
+ $controllerResolver = new HttpKernel\Controller\ControllerResolver();
95
+ $argumentResolver = new HttpKernel\Controller\ArgumentResolver($argumentMetadataFactory, $valueResolvers);
78
96
79
- $controller = $resolver ->getController($request);
80
- $arguments = $resolver ->getArguments($request, $controller);
97
+ $controller = $controllerResolver ->getController($request);
98
+ $arguments = $argumentResolver ->getArguments($request, $controller);
81
99
82
100
$response = call_user_func_array($controller, $arguments);
83
101
@@ -140,20 +158,19 @@ method is not defined, an argument has no matching attribute, ...).
140
158
141
159
.. note ::
142
160
143
- With the great flexibility of the default controller resolver, you might
144
- wonder why someone would want to create another one (why would there be an
145
- interface if not?). Two examples: in Symfony, ``getController() `` is
146
- enhanced to support
147
- :doc: `controllers as services </cookbook/controller/service >`; and in
148
- `FrameworkExtraBundle `_, ``getArguments() `` is enhanced to support
149
- parameter converters, where request attributes are converted to objects
150
- automatically.
161
+ With the great flexibility of the default controller resolver and argument
162
+ resolver, you might wonder why someone would want to create another one
163
+ (why would there be an interface if not?). Two examples: in Symfony,
164
+ ``getController() `` is enhanced to support :doc: `controllers as services </cookbook/controller/service >`;
165
+ and ``getArguments() `` provides an extension point to alter or enhance
166
+ the resolving of arguments.
151
167
152
168
Let's conclude with the new version of our framework::
153
169
154
170
// example.com/web/front.php
155
171
require_once __DIR__.'/../vendor/autoload.php';
156
172
173
+ use Symfony\Component\HttpKernel\Controller\ArgumentValueResolver as ArgumentValueResolver;
157
174
use Symfony\Component\HttpFoundation\Request;
158
175
use Symfony\Component\HttpFoundation\Response;
159
176
use Symfony\Component\Routing;
@@ -174,13 +191,27 @@ Let's conclude with the new version of our framework::
174
191
$context = new Routing\RequestContext();
175
192
$context->fromRequest($request);
176
193
$matcher = new Routing\Matcher\UrlMatcher($routes, $context);
177
- $resolver = new HttpKernel\Controller\ControllerResolver();
194
+
195
+ $valueResolvers = [
196
+ new ArgumentValueResolver\ArgumentFromAttributeResolver(),
197
+ new ArgumentValueResolver\VariadicArgumentValueResolver(),
198
+ new ArgumentValueResolver\RequestResolver(),
199
+ new ArgumentValueResolver\DefaultArgumentValueResolver(),
200
+ ];
201
+
202
+ $argumentMetadataFactory = new Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadataFactory();
203
+
204
+ $controllerResolver = new HttpKernel\Controller\ControllerResolver();
205
+ $argumentResolver = new HttpKernel\Controller\ArgumentResolver($argumentMetadataFactory, $valueResolvers);
206
+
207
+ $controller = $controllerResolver->getController($request);
208
+ $arguments = $argumentResolver->getArguments($request, $controller);
178
209
179
210
try {
180
211
$request->attributes->add($matcher->match($request->getPathInfo()));
181
212
182
- $controller = $resolver ->getController($request);
183
- $arguments = $resolver ->getArguments($request, $controller);
213
+ $controller = $controllerResolver ->getController($request);
214
+ $arguments = $argumentResolver ->getArguments($request, $controller);
184
215
185
216
$response = call_user_func_array($controller, $arguments);
186
217
} catch (Routing\Exception\ResourceNotFoundException $e) {
@@ -192,7 +223,7 @@ Let's conclude with the new version of our framework::
192
223
$response->send();
193
224
194
225
Think about it once more: our framework is more robust and more flexible than
195
- ever and it still has less than 40 lines of code.
226
+ ever and it still has less than 60 lines of code.
196
227
197
228
.. _`reflection` : http://php.net/reflection
198
229
.. _`FrameworkExtraBundle` : http://symfony.com/doc/current/bundles/SensioFrameworkExtraBundle/annotations/converters.html
0 commit comments