@@ -43,10 +43,20 @@ 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.
58
+
59
+ .. code-block :: php
50
60
51
61
namespace Symfony\Component\HttpKernel\Controller;
52
62
@@ -58,6 +68,12 @@ a Request object. All controller resolvers implement the following interface::
58
68
function getArguments(Request $request, $controller);
59
69
}
60
70
71
+ // ...
72
+ interface ArgumentResolverInterface
73
+ {
74
+ function getArguments(Request $request, $controller);
75
+ }
76
+
61
77
The ``getController() `` method relies on the same convention as the one we
62
78
have defined earlier: the ``_controller `` request attribute must contain the
63
79
controller associated with the Request. Besides the built-in PHP callbacks,
@@ -74,10 +90,14 @@ resolver from HttpKernel::
74
90
75
91
use Symfony\Component\HttpKernel;
76
92
77
- $resolver = new HttpKernel\Controller\ControllerResolver();
93
+ $valueResolvers = [/* array of ArgumentValueResolverInterface implemetations */];
94
+ $argumentMetadataFactory = new Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadataFactory();
95
+
96
+ $controllerResolver = new HttpKernel\Controller\ControllerResolver();
97
+ $argumentResolver = new HttpKernel\Controller\ArgumentResolver($argumentMetadataFactory, $valueResolvers);
78
98
79
- $controller = $resolver ->getController($request);
80
- $arguments = $resolver ->getArguments($request, $controller);
99
+ $controller = $controllerResolver ->getController($request);
100
+ $arguments = $argumentResolver ->getArguments($request, $controller);
81
101
82
102
$response = call_user_func_array($controller, $arguments);
83
103
@@ -140,20 +160,19 @@ method is not defined, an argument has no matching attribute, ...).
140
160
141
161
.. note ::
142
162
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.
163
+ With the great flexibility of the default controller resolver and argument
164
+ resolver, you might wonder why someone would want to create another one
165
+ (why would there be an interface if not?). Two examples: in Symfony,
166
+ ``getController() `` is enhanced to support :doc: `controllers as services </cookbook/controller/service >`;
167
+ and ``getArguments() `` provides an extension point to alter or enhance
168
+ the resolving of arguments.
151
169
152
170
Let's conclude with the new version of our framework::
153
171
154
172
// example.com/web/front.php
155
173
require_once __DIR__.'/../vendor/autoload.php';
156
174
175
+ use Symfony\Component\HttpKernel\Controller\ArgumentValueResolver as ArgumentValueResolver;
157
176
use Symfony\Component\HttpFoundation\Request;
158
177
use Symfony\Component\HttpFoundation\Response;
159
178
use Symfony\Component\Routing;
@@ -174,13 +193,27 @@ Let's conclude with the new version of our framework::
174
193
$context = new Routing\RequestContext();
175
194
$context->fromRequest($request);
176
195
$matcher = new Routing\Matcher\UrlMatcher($routes, $context);
177
- $resolver = new HttpKernel\Controller\ControllerResolver();
196
+
197
+ $valueResolvers = [
198
+ new ArgumentValueResolver\ArgumentFromAttributeResolver(),
199
+ new ArgumentValueResolver\VariadicArgumentValueResolver(),
200
+ new ArgumentValueResolver\RequestResolver(),
201
+ new ArgumentValueResolver\DefaultArgumentValueResolver(),
202
+ ];
203
+
204
+ $argumentMetadataFactory = new Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadataFactory();
205
+
206
+ $controllerResolver = new HttpKernel\Controller\ControllerResolver();
207
+ $argumentResolver = new HttpKernel\Controller\ArgumentResolver($argumentMetadataFactory, $valueResolvers);
208
+
209
+ $controller = $controllerResolver->getController($request);
210
+ $arguments = $argumentResolver->getArguments($request, $controller);
178
211
179
212
try {
180
213
$request->attributes->add($matcher->match($request->getPathInfo()));
181
214
182
- $controller = $resolver ->getController($request);
183
- $arguments = $resolver ->getArguments($request, $controller);
215
+ $controller = $controllerResolver ->getController($request);
216
+ $arguments = $argumentResolver ->getArguments($request, $controller);
184
217
185
218
$response = call_user_func_array($controller, $arguments);
186
219
} catch (Routing\Exception\ResourceNotFoundException $e) {
@@ -192,7 +225,7 @@ Let's conclude with the new version of our framework::
192
225
$response->send();
193
226
194
227
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.
228
+ ever and it still has less than 60 lines of code.
196
229
197
230
.. _`reflection` : http://php.net/reflection
198
231
.. _`FrameworkExtraBundle` : http://symfony.com/doc/current/bundles/SensioFrameworkExtraBundle/annotations/converters.html
0 commit comments