Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit dc19f30

Browse files
committed
Add the kernel.controller_arguments event
1 parent 6dbda50 commit dc19f30

File tree

5 files changed

+101
-2
lines changed

5 files changed

+101
-2
lines changed

src/Symfony/Component/HttpKernel/CHANGELOG.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ CHANGELOG
1010
* added `Symfony\Component\HttpKernel\Controller\ArgumentResolverInterface`
1111
* added `Symfony\Component\HttpKernel\Controller\ArgumentResolverInterface` as argument to `HttpKernel`
1212
* added `Symfony\Component\HttpKernel\Controller\ArgumentResolver`
13+
* added the `kernel.controller_arguments` event, triggered after controller arguments have been resolved
1314

1415
3.0.0
1516
-----
@@ -22,8 +23,8 @@ CHANGELOG
2223
* removed `Symfony\Component\HttpKernel\EventListener\RouterListener::setRequest()`
2324
* removed `Symfony\Component\HttpKernel\EventListener\ProfilerListener::onKernelRequest()`
2425
* removed `Symfony\Component\HttpKernel\Fragment\FragmentHandler::setRequest()`
25-
* removed `Symfony\Component\HttpKernel\HttpCache\Esi::hasSurrogateEsiCapability()`
26-
* removed `Symfony\Component\HttpKernel\HttpCache\Esi::addSurrogateEsiCapability()`
26+
* removed `Symfony\Component\HttpKernel\HttpCache\Esi::hasSurrogateEsiCapability()`
27+
* removed `Symfony\Component\HttpKernel\HttpCache\Esi::addSurrogateEsiCapability()`
2728
* removed `Symfony\Component\HttpKernel\HttpCache\Esi::needsEsiParsing()`
2829
* removed `Symfony\Component\HttpKernel\HttpCache\HttpCache::getEsi()`
2930
* removed `Symfony\Component\HttpKernel\DependencyInjection\ContainerAwareHttpKernel`
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the Symfony package.
5+
*
6+
* (c) Fabien Potencier <[email protected]>
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
namespace Symfony\Component\HttpKernel\Event;
13+
14+
use Symfony\Component\HttpKernel\HttpKernelInterface;
15+
use Symfony\Component\HttpFoundation\Request;
16+
17+
/**
18+
* Allows filtering of controller arguments.
19+
*
20+
* You can call getController() to retrieve the controller and getArgument
21+
* to retrieve the current argument. With setArguments() you can replace
22+
* arguments that are used to call the controller.
23+
*
24+
* Arguments set in the event must be compatible with the signature of the
25+
* controller.
26+
*
27+
* @author Christophe Coevoet <[email protected]>
28+
*/
29+
class FilterControllerArgumentsEvent extends KernelEvent
30+
{
31+
private $controller;
32+
private $arguments;
33+
34+
public function __construct(HttpKernelInterface $kernel, callable $controller, array $arguments, Request $request, $requestType)
35+
{
36+
parent::__construct($kernel, $request, $requestType);
37+
38+
$this->controller = $controller;
39+
$this->arguments = $arguments;
40+
}
41+
42+
/**
43+
* Returns the current controller.
44+
*
45+
* @return callable
46+
*/
47+
public function getController()
48+
{
49+
return $this->controller;
50+
}
51+
52+
/**
53+
* @return array
54+
*/
55+
public function getArguments()
56+
{
57+
return $this->arguments;
58+
}
59+
60+
/**
61+
* @param array $arguments
62+
*/
63+
public function setArguments(array $arguments)
64+
{
65+
$this->arguments = $arguments;
66+
}
67+
}

src/Symfony/Component/HttpKernel/HttpKernel.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
use Symfony\Component\HttpKernel\Controller\ArgumentResolver;
1515
use Symfony\Component\HttpKernel\Controller\ArgumentResolverInterface;
1616
use Symfony\Component\HttpKernel\Controller\ControllerResolverInterface;
17+
use Symfony\Component\HttpKernel\Event\FilterControllerArgumentsEvent;
1718
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
1819
use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface;
1920
use Symfony\Component\HttpKernel\Event\FilterControllerEvent;
@@ -138,6 +139,10 @@ private function handleRaw(Request $request, $type = self::MASTER_REQUEST)
138139
// controller arguments
139140
$arguments = $this->argumentResolver->getArguments($request, $controller);
140141

142+
$event = new FilterControllerArgumentsEvent($this, $controller, $arguments, $request, $type);
143+
$this->dispatcher->dispatch(KernelEvents::CONTROLLER_ARGUMENTS, $event);
144+
$arguments = $event->getArguments();
145+
141146
// call controller
142147
$response = call_user_func_array($controller, $arguments);
143148

src/Symfony/Component/HttpKernel/KernelEvents.php

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,19 @@ final class KernelEvents
7676
*/
7777
const CONTROLLER = 'kernel.controller';
7878

79+
/**
80+
* The CONTROLLER_ARGUMENTS event occurs once controller arguments have been resolved.
81+
*
82+
* This event allows you to change the arguments that will be passed to
83+
* the controller. The event listener method receives a
84+
* Symfony\Component\HttpKernel\Event\FilterControllerArgumentsEvent instance.
85+
*
86+
* @Event
87+
*
88+
* @var string
89+
*/
90+
const CONTROLLER_ARGUMENTS = 'kernel.controller_arguments';
91+
7992
/**
8093
* The RESPONSE event occurs once a response was created for
8194
* replying to a request.

src/Symfony/Component/HttpKernel/Tests/HttpKernelTest.php

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
use Symfony\Component\HttpFoundation\RequestStack;
1616
use Symfony\Component\HttpKernel\Controller\ArgumentResolverInterface;
1717
use Symfony\Component\HttpKernel\Controller\ControllerResolverInterface;
18+
use Symfony\Component\HttpKernel\Event\FilterControllerArgumentsEvent;
1819
use Symfony\Component\HttpKernel\HttpKernel;
1920
use Symfony\Component\HttpKernel\HttpKernelInterface;
2021
use Symfony\Component\HttpKernel\KernelEvents;
@@ -233,6 +234,18 @@ public function testHandleWithAResponseListener()
233234
$this->assertEquals('foo', $kernel->handle(new Request())->getContent());
234235
}
235236

237+
public function testHandleAllowChangingControllerArguments()
238+
{
239+
$dispatcher = new EventDispatcher();
240+
$dispatcher->addListener(KernelEvents::CONTROLLER_ARGUMENTS, function (FilterControllerArgumentsEvent $event) {
241+
$event->setArguments(array('foo'));
242+
});
243+
244+
$kernel = $this->getHttpKernel($dispatcher, function ($content) { return new Response($content); });
245+
246+
$this->assertResponseEquals(new Response('foo'), $kernel->handle(new Request()));
247+
}
248+
236249
public function testTerminate()
237250
{
238251
$dispatcher = new EventDispatcher();

0 commit comments

Comments
 (0)