10000 [FrameworkBundle] Simplify "invokable" controllers as services · symfony/symfony@e712e89 · GitHub
[go: up one dir, main page]

Skip to content

Commit e712e89

Browse files
kbondfabpot
authored andcommitted
[FrameworkBundle] Simplify "invokable" controllers as services
1 parent ce15db5 commit e712e89

File tree

3 files changed

+176
-12
lines changed

3 files changed

+176
-12
lines changed

src/Symfony/Bundle/FrameworkBundle/Controller/ControllerResolver.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,10 @@ protected function createController($controller)
6363
list($service, $method) = explode(':', $controller, 2);
6464

6565
return array($this->container->get($service), $method);
66+
} elseif ($this->container->has($controller) &&
67+
method_exists($service = $this->container->get($controller), '__invoke')
68+
) {
69+
return $service;
6670
} else {
6771
throw new \LogicException(sprintf('Unable to parse the controller name "%s".', $controller));
6872
}
Lines changed: 155 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,155 @@
1+
<?php
2+
3+
namespace Symfony\Bundle\FrameworkBundle\Tests\Controller;
4+
5+
use Psr\Log\LoggerInterface;
6+
use Symfony\Bundle\FrameworkBundle\Controller\ControllerNameParser;
7+
use Symfony\Bundle\FrameworkBundle\Controller\ControllerResolver;
8+
use Symfony\Component\DependencyInjection\ContainerAwareInterface;
9+
use Symfony\Component\DependencyInjection\ContainerInterface;
10+
use Symfony\Component\HttpFoundation\Request;
11+
use Symfony\Component\HttpKernel\Tests\Controller\ControllerResolverTest as BaseControllerResolverTest;
12+
13+
class ControllerResolverTest extends BaseControllerResolverTest
14+
{
15+
public function testGetControllerOnContainerAware()
16+
{
17+
$resolver = $this->createControllerResolver();
18+
$request = Request::create('/');
19+
$request->attributes->set('_controller', 'Symfony\Bundle\FrameworkBundle\Tests\Controller\ContainerAwareController::testAction');
20+
21+
$controller = $resolver->getController($request);
22+
23+
$this->assertInstanceOf('Symfony\Component\DependencyInjection\ContainerInterface', $controller[0]->getContainer());
24+
$this->assertSame('testAction', $controller[1]);
25+
}
26+
27+
public function testGetControllerWithBundleNotation()
28+
{
29+
$shortName = 'FooBundle:Default:test';
30+
$parser = $this->createMockParser();
31+
$parser->expects($this->once())
32+
->method('parse')
33+
->with($shortName)
34+
->will($this->returnValue('Symfony\Bundle\FrameworkBundle\Tests\Controller\ContainerAwareController::testAction'))
35+
;
36+
37+
$resolver = $this->createControllerResolver(null, $parser);
38+
$request = Request::create('/');
39+
$request->attributes->set('_controller', $shortName);
40+
41+
$controller = $resolver->getController($request);
42+
43+
$this->assertInstanceOf('Symfony\Bundle\FrameworkBundle\Tests\Controller\ContainerAwareController', $controller[0]);
44+
$this->assertInstanceOf('Symfony\Component\DependencyInjection\ContainerInterface', $controller[0]->getContainer());
45+
$this->assertSame('testAction', $controller[1]);
46+
}
47+
48+
public function testGetControllerService()
49+
{
50+
$container = $this->createMockContainer();
51+
$container->expects($this->once())
52+
->method('get')
53+
->with('foo')
54+
->will($this->returnValue($this))
55+
;
56+
57+
$resolver = $this->createControllerResolver(null, null, $container);
58+
$request = Request::create('/');
59+
$request->attributes->set('_controller', 'foo:controllerMethod1');
60+
61+
$controller = $resolver->getController($request);
62+
63+
$this->assertInstanceOf(get_class($this), $controller[0]);
64+
$this->assertSame('controllerMethod1', $controller[1]);
65+
}
66+
67+
public function testGetControllerInvokableService()
68+
{
69+
$container = $this->createMockContainer();
70+
$container->expects($this->once())
71+
->method('has')
72+
->with('foo')
73+
->will($this->returnValue(true))
74+
;
75+
$container->expects($this->once())
76+
->method('get')
77+
->with('foo')
78+
->will($this->returnValue($this))
79+
;
80+
81+
$resolver = $this->createControllerResolver(null, null, $container);
82+
$request = Request::create('/');
83+
$request->attributes->set('_controller', 'foo');
84+
85+
$controller = $resolver->getController($request);
86+
87+
$this->assertInstanceOf(get_class($this), $controller);
88+
}
89+
90+
/**
91+
* @dataProvider getUndefinedControllers
92+
*/
93+
public function testGetControllerOnNonUndefinedFunction($controller, $exceptionName = null, $exceptionMessage = null)
94+
{
95+
$this->setExpectedException($exceptionName, $exceptionMessage);
96+
97+
parent::testGetControllerOnNonUndefinedFunction($controller);
98+
}
99+
100+
public function getUndefinedControllers()
101+
{
102+
return array(
103+
array('foo', '\LogicException', 'Unable to parse the controller name "foo".'),
104+
array('foo::bar', '\InvalidArgumentException', 'Class "foo" does not exist.'),
105+
array('stdClass', '\LogicException', 'Unable to parse the controller name "stdClass".'),
106+
array(
107+
'Symfony\Component\HttpKernel\Tests\Controller\ControllerResolverTest::bar',
108+
'\InvalidArgumentException',
109+
'Controller "Symfony\Component\HttpKernel\Tests\Controller\ControllerResolverTest::bar" for URI "/" is not callable.'
110+
)
111+
);
112+
}
113+
114+
protected function createControllerResolver(LoggerInterface $logger = null, ControllerNameParser $parser = null, ContainerInterface $container = null)
115+
{
116+
if (!$parser) {
117+
$parser = $this->createMockParser();
118+
}
119+
120+
if (!$container) {
121+
$container = $this->createMockContainer();
122+
}
123+
124+
return new ControllerResolver($container, $parser, $logger);
125+
}
126+
127+
protected function createMockParser()
128+
{
129+
return $this->getMock('Symfony\Bundle\FrameworkBundle\Controller\ControllerNameParser', array(), array(), '', false);
130+
}
131+
132+
protected function createMockContainer()
133+
{
134+
return $this->getMock('Symfony\Component\DependencyInjection\ContainerInterface');
135+
}
136+
}
137+
138+
class ContainerAwareController implements ContainerAwareInterface
139+
{
140+
private $container;
141+
142+
public function setContainer(ContainerInterface $container = null)
143+
{
144+
$this->container = $container;
145+
}
146+
147+
public function getContainer()
148+
{
149+
return $this->container;
150+
}
151+
152+
public function testAction()
153+
{
154+
}
155+
}

src/Symfony/Component/HttpKernel/Tests/Controller/ControllerResolverTest.php

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@
1111

1212
namespace Symfony\Component\HttpKernel\Tests\Controller;
1313

14+
use Psr\Log\LoggerInterface;
1415
use Symfony\Component\HttpKernel\Controller\ControllerResolver;
15-
use Symfony\Component\HttpKernel\Tests\Logger;
1616
use Symfony\Component\HttpFoundation\Request;
1717

1818
class ControllerResolverTest extends \PHPUnit_Framework_TestCase
@@ -21,15 +21,15 @@ public function testGetControllerWithoutControllerParameter()
2121
{
2222
$logger = $this->getMock('Psr\Log\LoggerInterface');
2323
$logger->expects($this->once())->method('warning')->with('Unable to look for the controller as the "_controller" parameter is missing');
24-
$resolver = new ControllerResolver($logger);
24+
$resolver = $this->createControllerResolver($logger);
2525

2626
$request = Request::create('/');
2727
$this->assertFalse($resolver->getController($request), '->getController() returns false when the request has no _controller attribute');
2828
}
2929

3030
public function testGetControllerWithLambda()
3131
{
32-
$resolver = new ControllerResolver();
32+
$resolver = $this->createControllerResolver();
3333

3434
$request = Request::create('/');
3535
$request->attributes->set('_controller', $lambda = function () {});
@@ -39,7 +39,7 @@ public function testGetControllerWithLambda()
3939

4040
public function testGetControllerWithObjectAndInvokeMethod()
4141
{
42-
$resolver = new ControllerResolver();
42+
$resolver = $this->createControllerResolver();
4343

4444
$request = Request::create('/');
4545
$request->attributes->set('_controller', $this);
@@ -49,7 +49,7 @@ public function testGetControllerWithObjectAndInvokeMethod()
4949

5050
public function testGetControllerWithObjectAndMethod()
5151
{
52-
$resolver = new ControllerResolver();
52+
$resolver = $this->createControllerResolver();
5353

5454
$request = Request::create('/');
5555
$request->attributes->set('_controller', array($this, 'controllerMethod1'));
@@ -59,7 +59,7 @@ public function testGetControllerWithObjectAndMethod()
5959

6060
public function testGetControllerWithClassAndMethod()
6161
{
62-
$resolver = new ControllerResolver();
62+
$resolver = $this->createControllerResolver();
6363

6464
$request = Request::create('/');
6565
$request->attributes->set('_controller', array('Symfony\Component\HttpKernel\Tests\Controller\ControllerResolverTest', 'controllerMethod4'));
@@ -69,7 +69,7 @@ public function testGetControllerWithClassAndMethod()
6969

7070
public function testGetControllerWithObjectAndMethodAsString()
7171
{
72-
$resolver = new ControllerResolver();
72+
$resolver = $this->createControllerResolver();
7373

7474
$request = Request::create('/');
7575
$request->attributes->set('_controller', 'Symfony\Component\HttpKernel\Tests\Controller\ControllerResolverTest::controllerMethod1');
@@ -79,7 +79,7 @@ public function testGetControllerWithObjectAndMethodAsString()
7979

8080
public function testGetControllerWithClassAndInvokeMethod()
8181
{
82-
$resolver = new ControllerResolver();
82+
$resolver = $this->createControllerResolver();
8383

8484
$request = Request::create('/');
8585
$request->attributes->set('_controller', 'Symfony\Component\HttpKernel\Tests\Controller\ControllerResolverTest');
@@ -92,7 +92,7 @@ public function testGetControllerWithClassAndInvokeMethod()
9292
*/
9393
public function testGetControllerOnObjectWithoutInvokeMethod()
9494
{
95-
$resolver = new ControllerResolver();
95+
$resolver = $this->createControllerResolver();
9696

9797
$request = Request::create('/');
9898
$request->attributes->set('_controller', new \stdClass());
@@ -101,7 +101,7 @@ public function testGetControllerOnObjectWithoutInvokeMethod()
101101

102102
public function testGetControllerWithFunction()
103103
{
104-
$resolver = new ControllerResolver();
104+
$resolver = $this->createControllerResolver();
105105

106106
$request = Request::create('/');
107107
$request->attributes->set('_controller', 'Symfony\Component\HttpKernel\Tests\Controller\some_controller_function');
@@ -115,7 +115,7 @@ public function testGetControllerWithFunction()
115115
*/
116116
public function testGetControllerOnNonUndefinedFunction($controller)
117117
{
118-
$resolver = new ControllerResolver();
118+
$resolver = $this->createControllerResolver();
119119

120120
$request = Request::create('/');
121121
$request->attributes->set('_controller', $controller);
@@ -134,7 +134,7 @@ public function getUndefinedControllers()
134134

135135
public function testGetArguments()
136136
{
137-
$resolver = new ControllerResolver();
137+
$resolver = $this->createControllerResolver();
138138

139139
$request = Request::create('/');
140140
$controller = array(new self(), 'testGetArguments');
@@ -207,6 +207,11 @@ public function testCreateControllerCanReturnAnyCallable()
207207
$mock->getController($request);
208208
}
209209

210+
protected function createControllerResolver(LoggerInterface $logger = null)
211+
{
212+
return new ControllerResolver($logger);
213+
}
214+
210215
public function __invoke($foo, $bar = null)
211216
{
212217
}

0 commit comments

Comments
 (0)
0