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 <fabien@symfony.com>
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 <stof@notk.org>
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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy