Skip to content

Commit e35d345

Browse files
committed
changed HttpKernel workflow to allow more flexibility
1 parent 3ec9005 commit e35d345

File tree

11 files changed

+73
-144
lines changed

11 files changed

+73
-144
lines changed

src/Symfony/Bundle/FrameworkBundle/Controller/ControllerManager.php renamed to src/Symfony/Bundle/FrameworkBundle/Controller/ControllerResolver.php

+6-7
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
namespace Symfony\Bundle\FrameworkBundle\Controller;
44

55
use Symfony\Components\HttpKernel\LoggerInterface;
6-
use Symfony\Components\HttpKernel\Controller\ControllerManagerInterface;
6+
use Symfony\Components\HttpKernel\Controller\ControllerResolverInterface;
77
use Symfony\Components\HttpKernel\HttpKernelInterface;
88
use Symfony\Components\HttpFoundation\Request;
99
use Symfony\Components\EventDispatcher\Event;
@@ -19,13 +19,13 @@
1919
*/
2020

2121
/**
22-
* ControllerManager.
22+
* ControllerResolver.
2323
*
2424
* @package Symfony
2525
* @subpackage Bundle_FrameworkBundle
2626
* @author Fabien Potencier <[email protected]>
2727
*/
28-
class ControllerManager implements ControllerManagerInterface
28+
class ControllerResolver implements ControllerResolverInterface
2929
{
3030
protected $container;
3131
protected $logger;
@@ -122,7 +122,7 @@ public function render($controller, array $options = array())
122122
* @param \Symfony\Components\HttpFoundation\Request $request A Request instance
123123
*
124124
* @return mixed|Boolean A PHP callable representing the Controller,
125-
* or false if this manager is not able to determine the controller
125+
* or false if this resolver is not able to determine the controller
126126
*
127127
* @throws \InvalidArgumentException|\LogicException If the controller can't be found
128128
*/
@@ -190,10 +190,9 @@ public function getController(Request $request)
190190
*
191191
* @throws \RuntimeException When value for argument given is not provided
192192
*/
193-
public function getMethodArguments(Request $request, $controller)
193+
public function getArguments(Request $request, $controller)
194194
{
195-
$event = $this->container->get('event_dispatcher')->filter(new Event($this, 'controller_manager.filter_controller_arguments', array('controller' => $controller, 'request' => $request)), $request->attributes->all());
196-
$attributes = $event->getReturnValue();
195+
$attributes = $request->attributes->all();
197196

198197
list($controller, $method) = $controller;
199198

src/Symfony/Bundle/FrameworkBundle/Resources/config/templating.xml

+1-1
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@
8383

8484
<service id="templating.helper.actions" class="%templating.helper.actions.class%">
8585
<annotation name="templating.helper" alias="actions" />
86-
<argument type="service" id="controller_manager" />
86+
<argument type="service" id="controller_resolver" />
8787
</service>
8888

8989
<service id="templating.loader" alias="templating.loader.filesystem" />

src/Symfony/Bundle/FrameworkBundle/Resources/config/web.xml

+2-9
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,7 @@
66

77
<parameters>
88
<parameter key="request_listener.class">Symfony\Bundle\FrameworkBundle\RequestListener</parameter>
9-
<parameter key="controller_manager.class">Symfony\Bundle\FrameworkBundle\Controller\ControllerManager</parameter>
10-
<parameter key="controller_loader_listener.class">Symfony\Components\HttpKernel\Controller\ControllerLoaderListener</parameter>
9+
<parameter key="controller_resolver.class">Symfony\Bundle\FrameworkBundle\Controller\ControllerResolver</parameter>
1110
<parameter key="response_listener.class">Symfony\Components\HttpKernel\ResponseListener</parameter>
1211
<parameter key="exception_listener.class">Symfony\Bundle\FrameworkBundle\Controller\ExceptionListener</parameter>
1312
<parameter key="exception_listener.controller">FrameworkBundle:Exception:exception</parameter>
@@ -16,17 +15,11 @@
1615
</parameters>
1716

1817
<services>
19-
<service id="controller_manager" class="%controller_manager.class%">
18+
<service id="controller_resolver" class="%controller_resolver.class%">
2019
<argument type="service" id="service_container" />
2120
<argument type="service" id="logger" on-invalid="ignore" />
2221
</service>
2322

24-
<service id="controller_loader_listener" class="%controller_loader_listener.class%">
25-
<annotation name="kernel.listener" />
26-
<argument type="service" id="controller_manager" />
27-
<argument type="service" id="logger" on-invalid="ignore" />
28-
</service>
29-
3023
<service id="request_listener" class="%request_listener.class%">
3124
<annotation name="kernel.listener" />
3225
<argument type="service" id="service_container" />

src/Symfony/Bundle/FrameworkBundle/Templating/Helper/ActionsHelper.php

+6-6
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
use Symfony\Components\Templating\Helper\Helper;
66
use Symfony\Components\OutputEscaper\Escaper;
7-
use Symfony\Bundle\FrameworkBundle\Controller\ControllerManager;
7+
use Symfony\Bundle\FrameworkBundle\Controller\ControllerResolver;
88

99
/*
1010
* This file is part of the Symfony framework.
@@ -24,16 +24,16 @@
2424
*/
2525
class ActionsHelper extends Helper
2626
{
27-
protected $manager;
27+
protected $resolver;
2828

2929
/**
3030
* Constructor.
3131
*
3232
* @param Constructor $container A ContainerInterface instance
3333
*/
34-
public function __construct(ControllerManager $manager)
34+
public function __construct(ControllerResolver $resolver)
3535
{
36-
$this->manager = $manager;
36+
$this->resolver = $resolver;
3737
}
3838

3939
/**
@@ -55,7 +55,7 @@ public function output($controller, array $options = array())
5555
* @param string $controller A controller name to execute (a string like BlogBundle:Post:index), or a relative URI
5656
* @param array $options An array of options
5757
*
58-
* @see Symfony\Bundle\FrameworkBundle\Controller\ControllerManager::render()
58+
* @see Symfony\Bundle\FrameworkBundle\Controller\ControllerResolver::render()
5959
*/
6060
public function render($controller, array $options = array())
6161
{
@@ -69,7 +69,7 @@ public function render($controller, array $options = array())
6969
$options['query'] = Escaper::unescape($options['query']);
7070
}
7171

72-
return $this->manager->render($controller, $options);
72+
return $this->resolver->render($controller, $options);
7373
}
7474

7575
/**

src/Symfony/Components/HttpKernel/Controller/ControllerLoaderListener.php

-65
This file was deleted.

src/Symfony/Components/HttpKernel/Controller/ControllerManagerInterface.php renamed to src/Symfony/Components/HttpKernel/Controller/ControllerResolverInterface.php

+6-6
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
*/
1515

1616
/**
17-
* A ControllerManagerInterface implementation knows how to determine the
17+
* A ControllerResolverInterface implementation knows how to determine the
1818
* controller to execute based on a Request object.
1919
*
2020
* It can also determine the arguments to pass to the Controller.
@@ -25,21 +25,21 @@
2525
* @subpackage Bundle_FrameworkBundle
2626
* @author Fabien Potencier <[email protected]>
2727
*/
28-
interface ControllerManagerInterface
28+
interface ControllerResolverInterface
2929
{
3030
/**
3131
* Returns the Controller instance associated with a Request.
3232
*
33-
* As several managers can exist for a single application, a manager must
33+
* As several resolvers can exist for a single application, a resolver must
3434
* return false when it is not able to determine the controller.
3535
*
36-
* The manager must only throw an exception when it should be able to load
36+
* The resolver must only throw an exception when it should be able to load
3737
* controller but cannot because of some errors made by the developer.
3838
*
3939
* @param \Symfony\Components\HttpFoundation\Request $request A Request instance
4040
*
4141
* @return mixed|Boolean A PHP callable representing the Controller,
42-
* or false if this manager is not able to determine the controller
42+
* or false if this resolver is not able to determine the controller
4343
*
4444
* @throws \InvalidArgumentException|\LogicException If the controller can't be found
4545
*/
@@ -53,5 +53,5 @@ public function getController(Request $request);
5353
*
5454
* @throws \RuntimeException When value for argument given is not provided
5555
*/
56-
public function getMethodArguments(Request $request, $controller);
56+
public function getArguments(Request $request, $controller);
5757
}

src/Symfony/Components/HttpKernel/HttpKernel.php

+28-31
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
use Symfony\Components\EventDispatcher\Event;
66
use Symfony\Components\EventDispatcher\EventDispatcher;
7+
use Symfony\Components\HttpKernel\Controller\ControllerResolverInterface;
78
use Symfony\Components\HttpKernel\Exception\NotFoundHttpException;
89
use Symfony\Components\HttpFoundation\Request;
910
use Symfony\Components\HttpFoundation\Response;
@@ -27,16 +28,19 @@
2728
class HttpKernel implements HttpKernelInterface
2829
{
2930
protected $dispatcher;
31+
protected $resolver;
3032
protected $request;
3133

3234
/**
3335
* Constructor
3436
*
35-
* @param EventDispatcher $dispatcher An event dispatcher instance
37+
* @param \Symfony\Components\EventDispatcher\EventDispatcher $dispatcher An event dispatcher instance
38+
* @param \Symfony\Components\HttpKernel\Controller\ControllerResolverInterface $resolver A ControllerResolverInterface instance
3639
*/
37-
public function __construct(EventDispatcher $dispatcher)
40+
public function __construct(EventDispatcher $dispatcher, ControllerResolverInterface $resolver)
3841
{
3942
$this->dispatcher = $dispatcher;
43+
$this->resolver = $resolver;
4044
}
4145

4246
/**
@@ -55,11 +59,11 @@ public function getRequest()
5559
* All exceptions are caught, and a core.exception event is notified
5660
* for user management.
5761
*
58-
* @param Request $request A Request instance
59-
* @param integer $type The type of the request (one of HttpKernelInterface::MASTER_REQUEST, HttpKernelInterface::FORWARDED_REQUEST, or HttpKernelInterface::EMBEDDED_REQUEST)
60-
* @param Boolean $raw Whether to catch exceptions or not
62+
* @param \Symfony\Components\HttpFoundation\Request $request A Request instance
63+
* @param integer $type The type of the request (one of HttpKernelInterface::MASTER_REQUEST, HttpKernelInterface::FORWARDED_REQUEST, or HttpKernelInterface::EMBEDDED_REQUEST)
64+
* @param Boolean $raw Whether to catch exceptions or not
6165
*
62-
* @return Response A Response instance
66+
* @return \Symfony\Components\HttpFoundation\Response A Response instance
6367
*
6468
* @throws \Exception When an Exception occurs during processing
6569
* and couldn't be caught by event processing or $raw is true
@@ -100,13 +104,13 @@ public function handle(Request $request = null, $type = HttpKernelInterface::MAS
100104
*
101105
* Exceptions are not caught.
102106
*
103-
* @param Request $request A Request instance
104-
* @param integer $type The type of the request (one of HttpKernelInterface::MASTER_REQUEST, HttpKernelInterface::FORWARDED_REQUEST, or HttpKernelInterface::EMBEDDED_REQUEST)
107+
* @param \Symfony\Components\HttpFoundation\Request $request A Request instance
108+
* @param integer $type The type of the request (one of HttpKernelInterface::MASTER_REQUEST, HttpKernelInterface::FORWARDED_REQUEST, or HttpKernelInterface::EMBEDDED_REQUEST)
105109
*
106-
* @return Response A Response instance
110+
* @return \Symfony\Components\HttpFoundation\Response A Response instance
107111
*
108-
* @throws \LogicException If one of the listener does not behave as expected
109-
* @throws NotFoundHttpException When controller cannot be found
112+
* @throws \LogicException If one of the listener does not behave as expected
113+
* @throws \Symfony\Components\HttpKernel\Exception\NotFoundHttpException When controller cannot be found
110114
*/
111115
protected function handleRaw(Request $request, $type = self::MASTER_REQUEST)
112116
{
@@ -117,30 +121,23 @@ protected function handleRaw(Request $request, $type = self::MASTER_REQUEST)
117121
}
118122

119123
// load controller
120-
$event = $this->dispatcher->notifyUntil(new Event($this, 'core.load_controller', array('request_type' => $type, 'request' => $request)));
121-
if (!$event->isProcessed()) {
124+
if (false === $controller = $this->resolver->getController($request)) {
122125
throw new NotFoundHttpException('Unable to find the controller.');
123126
}
124127

125-
list($controller, $arguments) = $event->getReturnValue();
128+
$event = $this->dispatcher->filter(new Event($this, 'core.controller', array('request' => $request)), $controller);
129+
$controller = $event->getReturnValue();
126130

127131
// controller must be a callable
128132
if (!is_callable($controller)) {
129133
throw new \LogicException(sprintf('The controller must be a callable (%s).', var_export($controller, true)));
130134
}
131135

132-
// controller
133-
$event = $this->dispatcher->notifyUntil(new Event($this, 'core.controller', array('request_type' => $type, 'request' => $request, 'controller' => &$controller, 'arguments' => &$arguments)));
134-
if ($event->isProcessed()) {
135-
try {
136-
return $this->filterResponse($event->getReturnValue(), $request, 'A "core.controller" listener returned a non response object.', $type);
137-
} catch (\Exception $e) {
138-
$retval = $event->getReturnValue();
139-
}
140-
} else {
141-
// call controller
142-
$retval = call_user_func_array($controller, $arguments);
143-
}
136+
// controller arguments
137+
$arguments = $this->resolver->getArguments($request, $controller);
138+
139+
// call controller
140+
$retval = call_user_func_array($controller, $arguments);
144141

145142
// view
146143
$event = $this->dispatcher->filter(new Event($this, 'core.view', array('request_type' => $type, 'request' => $request)), $retval);
@@ -151,7 +148,7 @@ protected function handleRaw(Request $request, $type = self::MASTER_REQUEST)
151148
/**
152149
* Handles a request that need to be embedded.
153150
*
154-
* @param Request $request A Request instance
151+
* @param \Symfony\Components\HttpFoundation\Request $request A Request instance
155152
* @param Boolean $raw Whether to catch exceptions or not
156153
*
157154
* @return string|false The Response content or false if there is a problem
@@ -182,11 +179,11 @@ protected function handleEmbedded(Request $request, $raw = false)
182179
/**
183180
* Filters a response object.
184181
*
185-
* @param Response $response A Response instance
186-
* @param string $message A error message in case the response is not a Response object
187-
* @param integer $type The type of the request (one of HttpKernelInterface::MASTER_REQUEST, HttpKernelInterface::FORWARDED_REQUEST, or HttpKernelInterface::EMBEDDED_REQUEST)
182+
* @param \Symfony\Components\HttpFoundation\Response $response A Response instance
183+
* @param string $message A error message in case the response is not a Response object
184+
* @param integer $type The type of the request (one of HttpKernelInterface::MASTER_REQUEST, HttpKernelInterface::FORWARDED_REQUEST, or HttpKernelInterface::EMBEDDED_REQUEST)
188185
*
189-
* @return Response The filtered Response instance
186+
* @return \Symfony\Components\HttpFoundation\Response The filtered Response instance
190187
*
191188
* @throws \RuntimeException if the passed object is not a Response instance
192189
*/

src/Symfony/Components/HttpKernel/HttpKernelInterface.php

+5-5
Original file line numberDiff line numberDiff line change
@@ -29,18 +29,18 @@ interface HttpKernelInterface
2929
/**
3030
* Handles a request to convert it to a response.
3131
*
32-
* @param Request $request A Request instance
33-
* @param integer $type The type of the request (one of HttpKernelInterface::MASTER_REQUEST, HttpKernelInterface::FORWARDED_REQUEST, or HttpKernelInterface::EMBEDDED_REQUEST)
34-
* @param Boolean $raw Whether to catch exceptions or not
32+
* @param \Symfony\Components\HttpFoundation\Request $request A Request instance
33+
* @param integer $type The type of the request (one of HttpKernelInterface::MASTER_REQUEST, HttpKernelInterface::FORWARDED_REQUEST, or HttpKernelInterface::EMBEDDED_REQUEST)
34+
* @param Boolean $raw Whether to catch exceptions or not
3535
*
36-
* @return Response $response A Response instance
36+
* @return \Symfony\Components\HttpFoundation\Response $response A Response instance
3737
*/
3838
public function handle(Request $request = null, $type = self::MASTER_REQUEST, $raw = false);
3939

4040
/**
4141
* Gets the Request instance associated with the master request.
4242
*
43-
* @return Request A Request instance
43+
* @return \Symfony\Components\HttpFoundation\Request A Request instance
4444
*/
4545
public function getRequest();
4646
}

0 commit comments

Comments
 (0)