Adding a new event subscriber that "parses" the _controller attribute in the FW
This commit is contained in:
parent
7a9875c3cd
commit
9578fd3eb6
@ -0,0 +1,48 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file is part of the Symfony package.
|
||||||
|
*
|
||||||
|
* (c) Fabien Potencier <fabien@symfony.com>
|
||||||
|
*
|
||||||
|
* For the full copyright and license information, please view the LICENSE
|
||||||
|
* file that was distributed with this source code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Symfony\Bundle\FrameworkBundle\EventListener;
|
||||||
|
|
||||||
|
use Symfony\Bundle\FrameworkBundle\Controller\ControllerNameParser;
|
||||||
|
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
|
||||||
|
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
|
||||||
|
use Symfony\Component\HttpKernel\KernelEvents;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Guarantees that the _controller key is parsed into its final format.
|
||||||
|
*
|
||||||
|
* @author Ryan Weaver <ryan@knpuniversity.com>
|
||||||
|
*/
|
||||||
|
class ResolveControllerNameSubscriber implements EventSubscriberInterface
|
||||||
|
{
|
||||||
|
private $parser;
|
||||||
|
|
||||||
|
public function __construct(ControllerNameParser $parser)
|
||||||
|
{
|
||||||
|
$this->parser = $parser;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function onKernelRequest(GetResponseEvent $event)
|
||||||
|
{
|
||||||
|
$controller = $event->getRequest()->attributes->get('_controller');
|
||||||
|
if ($controller && false === strpos($controller, '::') && 2 === substr_count($controller, ':')) {
|
||||||
|
// controller in the a:b:c notation then
|
||||||
|
$event->getRequest()->attributes->set('_controller', $this->parser->parse($controller));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function getSubscribedEvents()
|
||||||
|
{
|
||||||
|
return array(
|
||||||
|
KernelEvents::REQUEST => array('onKernelRequest', 24),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
@ -70,5 +70,10 @@
|
|||||||
<service id="validate_request_listener" class="Symfony\Component\HttpKernel\EventListener\ValidateRequestListener" public="true">
|
<service id="validate_request_listener" class="Symfony\Component\HttpKernel\EventListener\ValidateRequestListener" public="true">
|
||||||
<tag name="kernel.event_subscriber" />
|
<tag name="kernel.event_subscriber" />
|
||||||
</service>
|
</service>
|
||||||
|
|
||||||
|
<service id="resolve_controller_name_subscriber" class="Symfony\Bundle\FrameworkBundle\EventListener\ResolveControllerNameSubscriber">
|
||||||
|
<argument type="service" id="controller_name_converter" />
|
||||||
|
<tag name="kernel.event_subscriber" />
|
||||||
|
</service>
|
||||||
</services>
|
</services>
|
||||||
</container>
|
</container>
|
||||||
|
@ -0,0 +1,54 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file is part of the Symfony package.
|
||||||
|
*
|
||||||
|
* (c) Fabien Potencier <fabien@symfony.com>
|
||||||
|
*
|
||||||
|
* For the full copyright and license information, please view the LICENSE
|
||||||
|
* file that was distributed with this source code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Symfony\Bundle\FrameworkBundle\Tests\EventListener;
|
||||||
|
|
||||||
|
use Symfony\Bundle\FrameworkBundle\Controller\ControllerNameParser;
|
||||||
|
use Symfony\Bundle\FrameworkBundle\EventListener\ResolveControllerNameSubscriber;
|
||||||
|
use Symfony\Bundle\FrameworkBundle\Tests\TestCase;
|
||||||
|
use Symfony\Component\HttpFoundation\Request;
|
||||||
|
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
|
||||||
|
use Symfony\Component\HttpKernel\HttpKernelInterface;
|
||||||
|
|
||||||
|
class ResolveControllerNameSubscriberTest extends TestCase
|
||||||
|
{
|
||||||
|
public function testReplacesControllerAttribute()
|
||||||
|
{
|
||||||
|
$parser = $this->getMockBuilder(ControllerNameParser::class)->disableOriginalConstructor()->getMock();
|
||||||
|
$parser->expects($this->any())
|
||||||
|
->method('parse')
|
||||||
|
->with('AppBundle:Starting:format')
|
||||||
|
->willReturn('App\\Final\\Format::methodName');
|
||||||
|
$httpKernel = $this->getMockBuilder(HttpKernelInterface::class)->getMock();
|
||||||
|
|
||||||
|
$request = new Request();
|
||||||
|
$request->attributes->set('_controller', 'AppBundle:Starting:format');
|
||||||
|
|
||||||
|
$subscriber = new ResolveControllerNameSubscriber($parser);
|
||||||
|
$subscriber->onKernelRequest(new GetResponseEvent($httpKernel, $request, HttpKernelInterface::MASTER_REQUEST));
|
||||||
|
$this->assertEquals('App\\Final\\Format::methodName', $request->attributes->get('_controller'));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testSkipsOtherControllerFormats()
|
||||||
|
{
|
||||||
|
$parser = $this->getMockBuilder(ControllerNameParser::class)->disableOriginalConstructor()->getMock();
|
||||||
|
$parser->expects($this->never())
|
||||||
|
->method('parse');
|
||||||
|
$httpKernel = $this->getMockBuilder(HttpKernelInterface::class)->getMock();
|
||||||
|
|
||||||
|
$request = new Request();
|
||||||
|
$request->attributes->set('_controller', 'Other:format');
|
||||||
|
|
||||||
|
$subscriber = new ResolveControllerNameSubscriber($parser);
|
||||||
|
$subscriber->onKernelRequest(new GetResponseEvent($httpKernel, $request, HttpKernelInterface::MASTER_REQUEST));
|
||||||
|
$this->assertEquals('Other:format', $request->attributes->get('_controller'));
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,38 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file is part of the Symfony package.
|
||||||
|
*
|
||||||
|
* (c) Fabien Potencier <fabien@symfony.com>
|
||||||
|
*
|
||||||
|
* For the full copyright and license information, please view the LICENSE
|
||||||
|
* file that was distributed with this source code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Symfony\Bundle\FrameworkBundle\Tests\Functional\Bundle\TestBundle\Controller;
|
||||||
|
|
||||||
|
use Psr\Log\LoggerInterface;
|
||||||
|
use Symfony\Component\DependencyInjection\ContainerAwareInterface;
|
||||||
|
use Symfony\Component\DependencyInjection\ContainerAwareTrait;
|
||||||
|
use Symfony\Component\HttpFoundation\Response;
|
||||||
|
use Symfony\Component\HttpKernel\HttpKernelInterface;
|
||||||
|
|
||||||
|
class SubRequestServiceResolutionController implements ContainerAwareInterface
|
||||||
|
{
|
||||||
|
use ContainerAwareTrait;
|
||||||
|
|
||||||
|
public function indexAction()
|
||||||
|
{
|
||||||
|
$request = $this->container->get('request_stack')->getCurrentRequest();
|
||||||
|
$path['_forwarded'] = $request->attributes;
|
||||||
|
$path['_controller'] = 'TestBundle:SubRequestServiceResolution:fragment';
|
||||||
|
$subRequest = $request->duplicate(array(), null, $path);
|
||||||
|
|
||||||
|
return $this->container->get('http_kernel')->handle($subRequest, HttpKernelInterface::SUB_REQUEST);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function fragmentAction(LoggerInterface $logger)
|
||||||
|
{
|
||||||
|
return new Response('---');
|
||||||
|
}
|
||||||
|
}
|
@ -20,4 +20,12 @@ class SubRequestsTest extends WebTestCase
|
|||||||
|
|
||||||
$this->assertEquals('--fr/json--en/html--fr/json--http://localhost/subrequest/fragment/en', $client->getResponse()->getContent());
|
$this->assertEquals('--fr/json--en/html--fr/json--http://localhost/subrequest/fragment/en', $client->getResponse()->getContent());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testSubRequestControllerServicesAreResolved()
|
||||||
|
{
|
||||||
|
$client = $this->createClient(array('test_case' => 'ControllerServiceResolution', 'root_config' => 'config.yml'));
|
||||||
|
$client->request('GET', 'https://localhost/subrequest');
|
||||||
|
|
||||||
|
$this->assertEquals('---', $client->getResponse()->getContent());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,18 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file is part of the Symfony package.
|
||||||
|
*
|
||||||
|
* (c) Fabien Potencier <fabien@symfony.com>
|
||||||
|
*
|
||||||
|
* For the full copyright and license information, please view the LICENSE
|
||||||
|
* file that was distributed with this source code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
use Symfony\Bundle\FrameworkBundle\Tests\Functional\Bundle\TestBundle\TestBundle;
|
||||||
|
use Symfony\Bundle\FrameworkBundle\FrameworkBundle;
|
||||||
|
|
||||||
|
return array(
|
||||||
|
new FrameworkBundle(),
|
||||||
|
new TestBundle(),
|
||||||
|
);
|
@ -0,0 +1,10 @@
|
|||||||
|
imports:
|
||||||
|
- { resource: ../config/default.yml }
|
||||||
|
|
||||||
|
services:
|
||||||
|
Symfony\Bundle\FrameworkBundle\Tests\Functional\Bundle\TestBundle\Controller\SubRequestServiceResolutionController:
|
||||||
|
public: true
|
||||||
|
tags: [controller.service_arguments]
|
||||||
|
|
||||||
|
logger: { class: Psr\Log\NullLogger }
|
||||||
|
Psr\Log\LoggerInterface: '@logger'
|
@ -0,0 +1,4 @@
|
|||||||
|
sub_request_page:
|
||||||
|
path: /subrequest
|
||||||
|
defaults:
|
||||||
|
_controller: 'TestBundle:SubRequestServiceResolution:index'
|
Reference in New Issue
Block a user