Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit4edfe5a

Browse files
Iltar van der Berglinaori
Iltar van der Berg
authored andcommitted
Documented the ArgumentResolver along the ControllerResolver
1 parente89e5f1 commit4edfe5a

File tree

6 files changed

+176
-94
lines changed

6 files changed

+176
-94
lines changed

‎components/http_kernel/introduction.rst‎

Lines changed: 86 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -85,11 +85,22 @@ is really simple and involves creating an
8585
:doc:`event dispatcher</components/event_dispatcher/introduction>` and a
8686
:ref:`controller resolver<component-http-kernel-resolve-controller>` (explained
8787
below). To complete your working kernel, you'll add more event listeners
88-
to the events discussed below::
88+
to the events discussed below
89+
90+
..caution::
91+
92+
As of 3.1 the:class:`Symfony\\Component\\Httpkernel\\HttpKernel` accepts a fourth argument, which
93+
should be an instance of:class:`Symfony\\Component\\Httpkernel\\Controller\\ArgumentResolverInterface`.
94+
In 4.0 this argument will become mandatory and the:class:`Symfony\\Component\\Httpkernel\\HttpKernel`
95+
will no longer be able to fall back to the:class:`Symfony\\Component\\Httpkernel\\Controller\\ControllerResolver`.
96+
97+
..code-block::php
8998
9099
use Symfony\Component\HttpFoundation\Request;
91100
use Symfony\Component\HttpKernel\HttpKernel;
92101
use Symfony\Component\EventDispatcher\EventDispatcher;
102+
use Symfony\Component\HttpFoundation\RequestStack;
103+
use Symfony\Component\HttpKernel\Controller\ArgumentResolver;
93104
use Symfony\Component\HttpKernel\Controller\ControllerResolver;
94105
95106
// create the Request object
@@ -98,10 +109,12 @@ to the events discussed below::
98109
$dispatcher = new EventDispatcher();
99110
// ... add some event listeners
100111
101-
// create your controller resolver
102-
$resolver = new ControllerResolver();
112+
// create your controller and argument resolvers
113+
$controllerResolver = new ControllerResolver();
114+
$argumentResolver = new ArgumentResolver();
115+
103116
// instantiate the kernel
104-
$kernel = new HttpKernel($dispatcher, $resolver);
117+
$kernel = new HttpKernel($dispatcher, $controllerResolver, new RequestStack(), $argumentResolver);
105118
106119
// actually execute the kernel, which turns the request into a response
107120
// by dispatching events, calling a controller, and returning the response
@@ -212,7 +225,19 @@ Your job is to create a class that implements the interface and fill in its
212225
two methods: ``getController`` and ``getArguments``. In fact, one default
213226
implementation already exists, which you can use directly or learn from:
214227
:class:`Symfony\\Component\\HttpKernel\\Controller\\ControllerResolver`.
215-
This implementation is explained more in the sidebar below::
228+
This implementation is explained more in the sidebar below
229+
230+
231+
..caution::
232+
233+
The `getArguments()` method in the:class:`Symfony\\Component\\Httpkernel\\Controller\\ControllerResolver`
234+
and respective interface:class:`Symfony\\Component\\Httpkernel\\Controller\\ControllerResolverInterface`
235+
are deprecated as of 3.1 and will be removed in 4.0. You can use the
236+
:class:`Symfony\\Component\\Httpkernel\\Controller\\ArgumentResolver` which uses the
237+
:class:`Symfony\\Component\\Httpkernel\\Controller\\ArgumentResolverInterface` instead.
238+
239+
240+
..code-block::php
216241
217242
namespace Symfony\Component\HttpKernel\Controller;
218243
@@ -231,7 +256,7 @@ on the controller resolver. This method is passed the ``Request`` and is respons
231256
for somehow determining and returning a PHP callable (the controller) based
232257
on the request's information.
233258

234-
The second method,:method:`Symfony\\Component\\HttpKernel\\Controller\\ControllerResolverInterface::getArguments`,
259+
The second method,:method:`Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolverInterface::getArguments`,
235260
will be called after another event - ``kernel.controller`` - is dispatched.
236261

237262
..sidebar::Resolving the Controller in the Symfony Framework
@@ -310,11 +335,11 @@ on the event object that's passed to listeners on this event.
310335
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
311336

312337
Next, ``HttpKernel::handle`` calls
313-
:method:`Symfony\\Component\\HttpKernel\\Controller\\ControllerResolverInterface::getArguments`.
338+
:method:`Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolverInterface::getArguments`.
314339
Remember that the controller returned in ``getController`` is a callable.
315340
The purpose of ``getArguments`` is to return the array of arguments that
316341
should be passed to that controller. Exactly how this is done is completely
317-
up to your design, though the built-in:class:`Symfony\\Component\\HttpKernel\\Controller\\ControllerResolver`
342+
up to your design, though the built-in:class:`Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolver`
318343
is a good example.
319344

320345
..image::/images/components/http_kernel/07-controller-arguments.png
@@ -326,7 +351,7 @@ of arguments that should be passed when executing that callable.
326351
..sidebar::Getting the Controller Arguments in the Symfony Framework
327352

328353
Now that you know exactly what the controller callable (usually a method
329-
inside a controller object) is, the ``ControllerResolver`` uses `reflection`_
354+
inside a controller object) is, the ``ArgumentResolver`` uses `reflection`_
330355
on the callable to return an array of the *names* of each of the arguments.
331356
It then iterates over each of these arguments and uses the following tricks
332357
to determine which value should be passed for each argument:
@@ -339,7 +364,18 @@ of arguments that should be passed when executing that callable.
339364

340365
b) If the argument in the controller is type-hinted with Symfony's
341366
:class:`Symfony\\Component\\HttpFoundation\\Request` object, then the
342-
``Request`` is passed in as the value.
367+
``Request`` is passed in as the value. If you have a custom class extending
368+
the ``Request``, this is also accepted.
369+
370+
c) If the function or method argument is `variadic`_ and the ``Request``
371+
``attributes`` bag contains and array for that argument, they will all be
372+
available through the `variadic`_ argument.
373+
374+
This functionality is provided by resolvers implementing the
375+
:class:`Symfony\\Component\\HttpKernel\\Controller\\ArgumentValueResolverInterface`.
376+
There are four implementations which provide the default behavior of Symfony but
377+
customization is the key here. By implementing the ``ArgumentValueResolverInterface``
378+
yourself and passing this to the ``ArgumentResolver``, you can extend this functionality.
343379

344380
.. _component-http-kernel-calling-controller:
345381

@@ -612,47 +648,52 @@ A full Working Example
612648
----------------------
613649

614650
When using the HttpKernel component, you're free to attach any listeners
615-
to the core events and use any controller resolver that implements the
616-
:class:`Symfony\\Component\\HttpKernel\\Controller\\ControllerResolverInterface`.
617-
However, the HttpKernel component comes with some built-in listeners and
618-
a built-in ControllerResolver that can be used to create a working example::
651+
to the core events, use any controller resolver that implements the
652+
:class:`Symfony\\Component\\HttpKernel\\Controller\\ControllerResolverInterface` and
653+
use any argument resolver that implements the
654+
:class:`Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolverInterface`.
655+
However, the HttpKernel component comes with some built-in listeners, and everything
656+
else that can be used to create a working example::
619657

620-
use Symfony\Component\HttpFoundation\Request;
621-
use Symfony\Component\HttpFoundation\RequestStack;
622-
use Symfony\Component\HttpFoundation\Response;
623-
use Symfony\Component\HttpKernel\HttpKernel;
624-
use Symfony\Component\EventDispatcher\EventDispatcher;
625-
use Symfony\Component\HttpKernel\Controller\ControllerResolver;
626-
use Symfony\Component\HttpKernel\EventListener\RouterListener;
627-
use Symfony\Component\Routing\RouteCollection;
628-
use Symfony\Component\Routing\Route;
629-
use Symfony\Component\Routing\Matcher\UrlMatcher;
630-
use Symfony\Component\Routing\RequestContext;
631-
632-
$routes = new RouteCollection();
633-
$routes->add('hello', new Route('/hello/{name}', array(
634-
'_controller' => function (Request $request) {
635-
return new Response(
636-
sprintf("Hello %s", $request->get('name'))
637-
);
638-
}
639-
)
640-
));
658+
use Symfony\Component\EventDispatcher\EventDispatcher;
659+
use Symfony\Component\HttpFoundation\Request;
660+
use Symfony\Component\HttpFoundation\RequestStack;
661+
use Symfony\Component\HttpFoundation\Response;
662+
use Symfony\Component\HttpKernel\Controller\ArgumentResolver;
663+
use Symfony\Component\HttpKernel\Controller\ControllerResolver;
664+
use Symfony\Component\HttpKernel\EventListener\RouterListener;
665+
use Symfony\Component\HttpKernel\HttpKernel;
666+
use Symfony\Component\Routing\Matcher\UrlMatcher;
667+
use Symfony\Component\Routing\RequestContext;
668+
use Symfony\Component\Routing\Route;
669+
use Symfony\Component\Routing\RouteCollection;
641670

642-
$request = Request::createFromGlobals();
671+
$routes = new RouteCollection();
672+
$routes->add('hello', new Route('/hello/{name}', array(
673+
'_controller' => function (Request $request) {
674+
return new Response(
675+
sprintf("Hello %s", $request->get('name'))
676+
);
677+
})
678+
));
643679

644-
$matcher =new UrlMatcher($routes, new RequestContext());
680+
$request =Request::createFromGlobals();
645681

646-
$dispatcher = new EventDispatcher();
647-
$dispatcher->addSubscriber(new RouterListener($matcher, new RequestStack()));
682+
$matcher = new UrlMatcher($routes, new RequestContext());
648683

649-
$resolver = newControllerResolver();
650-
$kernel =newHttpKernel($dispatcher, $resolver);
684+
$dispatcher = newEventDispatcher();
685+
$dispatcher->addSubscriber(newRouterListener($matcher, new RequestStack()));
651686

652-
$response = $kernel->handle($request);
653-
$response->send();
687+
$controllerResolver = new ControllerResolver();
688+
$argumentResolver = new ArgumentResolver();
689+
690+
$kernel = new HttpKernel($dispatcher, $controllerResolver, new RequestStack(), $argumentResolver);
691+
692+
$response = $kernel->handle($request);
693+
$response->send();
694+
695+
$kernel->terminate($request, $response);
654696

655-
$kernel->terminate($request, $response);
656697

657698
.. _http-kernel-sub-requests:
658699

@@ -716,3 +757,4 @@ look like this::
716757
.. _`@ParamConverter`:https://symfony.com/doc/current/bundles/SensioFrameworkExtraBundle/annotations/converters.html
717758
.. _`@Template`:https://symfony.com/doc/current/bundles/SensioFrameworkExtraBundle/annotations/view.html
718759
.. _`EmailSenderListener`:https://github.com/symfony/swiftmailer-bundle/blob/master/EventListener/EmailSenderListener.php
760+
.. _variadic:http://php.net/manual/en/functions.arguments.php

‎create_framework/dependency_injection.rst‎

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,23 +9,26 @@ to it::
99
// example.com/src/Simplex/Framework.php
1010
namespace Simplex;
1111

12+
use Symfony\Component\EventDispatcher\EventDispatcher;
1213
use Symfony\Component\Routing;
14+
use Symfony\Component\HttpFoundation;
1315
use Symfony\Component\HttpKernel;
14-
use Symfony\Component\EventDispatcher\EventDispatcher;
1516

1617
class Framework extends HttpKernel\HttpKernel
1718
{
1819
public function __construct($routes)
1920
{
2021
$context = new Routing\RequestContext();
2122
$matcher = new Routing\Matcher\UrlMatcher($routes, $context);
22-
$resolver = new HttpKernel\Controller\ControllerResolver();
23+
24+
$controllerResolver = new HttpKernel\Controller\ControllerResolver();
25+
$argumentResolver = new HttpKernel\Controller\ArgumentResolver();
2326

2427
$dispatcher = new EventDispatcher();
2528
$dispatcher->addSubscriber(new HttpKernel\EventListener\RouterListener($matcher));
2629
$dispatcher->addSubscriber(new HttpKernel\EventListener\ResponseListener('UTF-8'));
2730

28-
parent::__construct($dispatcher, $resolver);
31+
parent::__construct($dispatcher, $controllerResolver, new RequestStack(), $argumentResolver);
2932
}
3033
}
3134

@@ -101,7 +104,8 @@ Create a new file to host the dependency injection container configuration::
101104
->setArguments(array($routes, new Reference('context')))
102105
;
103106
$sc->register('request_stack', 'Symfony\Component\HttpFoundation\RequestStack');
104-
$sc->register('resolver', 'Symfony\Component\HttpKernel\Controller\ControllerResolver');
107+
$sc->register('controller_resolver', 'Symfony\Component\HttpKernel\Controller\ControllerResolver');
108+
$sc->register('argument_resolver', 'Symfony\Component\HttpKernel\Controller\ArgumentResolver');
105109

106110
$sc->register('listener.router', 'Symfony\Component\HttpKernel\EventListener\RouterListener')
107111
->setArguments(array(new Reference('matcher'), new Reference('request_stack')))
@@ -118,7 +122,12 @@ Create a new file to host the dependency injection container configuration::
118122
->addMethodCall('addSubscriber', array(new Reference('listener.exception')))
119123
;
120124
$sc->register('framework', 'Simplex\Framework')
121-
->setArguments(array(new Reference('dispatcher'), new Reference('resolver')))
125+
->setArguments(array(
126+
new Reference('dispatcher'),
127+
new Reference('controller_resolver'),
128+
new Reference('request_stack'),
129+
new Reference('argument_resolver'),
130+
))
122131
;
123132

124133
return $sc;

‎create_framework/event_dispatcher.rst‎

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -36,24 +36,27 @@ the Response instance::
3636
// example.com/src/Simplex/Framework.php
3737
namespace Simplex;
3838

39+
use Symfony\Component\EventDispatcher\EventDispatcher;
3940
use Symfony\Component\HttpFoundation\Request;
4041
use Symfony\Component\HttpFoundation\Response;
41-
use Symfony\Component\Routing\Matcher\UrlMatcherInterface;
42-
use Symfony\Component\Routing\Exception\ResourceNotFoundException;
42+
use Symfony\Component\HttpKernel\Controller\ArgumentResolverInterface;
4343
use Symfony\Component\HttpKernel\Controller\ControllerResolverInterface;
44-
use Symfony\Component\EventDispatcher\EventDispatcher;
44+
use Symfony\Component\Routing\Exception\ResourceNotFoundException;
45+
use Symfony\Component\Routing\Matcher\UrlMatcherInterface;
4546

4647
class Framework
4748
{
48-
private $matcher;
49-
private $resolver;
5049
private $dispatcher;
50+
private $matcher;
51+
private $controllerResolver;
52+
private $argumentResolver;
5153

52-
public function __construct(EventDispatcher $dispatcher, UrlMatcherInterface $matcher, ControllerResolverInterface $resolver)
54+
public function __construct(EventDispatcher $dispatcher, UrlMatcherInterface $matcher, ControllerResolverInterface $controllerResolver, ArgumentResolverInterface $argumentResolver)
5355
{
54-
$this->matcher = $matcher;
55-
$this->resolver = $resolver;
5656
$this->dispatcher = $dispatcher;
57+
$this->matcher = $matcher;
58+
$this->controllerResolver = $controllerResolver;
59+
$this->argumentResolver = $argumentResolver;
5760
}
5861

5962
public function handle(Request $request)
@@ -63,8 +66,8 @@ the Response instance::
6366
try {
6467
$request->attributes->add($this->matcher->match($request->getPathInfo()));
6568

66-
$controller = $this->resolver->getController($request);
67-
$arguments = $this->resolver->getArguments($request, $controller);
69+
$controller = $this->controllerResolver->getController($request);
70+
$arguments = $this->argumentResolver->getArguments($request, $controller);
6871

6972
$response = call_user_func_array($controller, $arguments);
7073
} catch (ResourceNotFoundException $e) {

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp