Skip to content

Commit 9deb375

Browse files
committed
[Routing] Fix loading multiple class annotations for invokable classes
1 parent 50f333b commit 9deb375

File tree

3 files changed

+68
-11
lines changed

3 files changed

+68
-11
lines changed

Loader/AnnotationClassLoader.php

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -119,10 +119,15 @@ public function load($class, $type = null)
119119
}
120120
}
121121

122-
if (0 === $collection->count() && $class->hasMethod('__invoke') && $annot = $this->reader->getClassAnnotation($class, $this->routeAnnotationClass)) {
123-
$globals['path'] = '';
124-
$globals['name'] = '';
125-
$this->addRoute($collection, $annot, $globals, $class, $class->getMethod('__invoke'));
122+
if (0 === $collection->count() && $class->hasMethod('__invoke')) {
123+
foreach ($this->reader->getClassAnnotations($class) as $annot) {
124+
if ($annot instanceof $this->routeAnnotationClass) {
125+
$globals['path'] = '';
126+
$globals['name'] = '';
127+
128+
$this->addRoute($collection, $annot, $globals, $class, $class->getMethod('__invoke'));
129+
}
130+
}
126131
}
127132

128133
return $collection;

Tests/Loader/AnnotationClassLoaderTest.php

Lines changed: 46 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -191,9 +191,9 @@ public function testInvokableClassRouteLoad()
191191
);
192192

193193
$this->reader
194-
->expects($this->exactly(2))
195-
->method('getClassAnnotation')
196-
->will($this->returnValue($this->getAnnotatedRoute($classRouteData)))
194+
->expects($this->exactly(1))
195+
->method('getClassAnnotations')
196+
->will($this->returnValue(array($this->getAnnotatedRoute($classRouteData))))
197197
;
198198
$this->reader
199199
->expects($this->once())
@@ -205,8 +205,49 @@ public function testInvokableClassRouteLoad()
205205
$route = $routeCollection->get($classRouteData['name']);
206206

207207
$this->assertSame($classRouteData['path'], $route->getPath(), '->load preserves class route path');
208-
$this->assertEquals(array_merge($classRouteData['schemes'], $classRouteData['schemes']), $route->getSchemes(), '->load preserves class route schemes');
209-
$this->assertEquals(array_merge($classRouteData['methods'], $classRouteData['methods']), $route->getMethods(), '->load preserves class route methods');
208+
$this->assertEquals($classRouteData['schemes'], $route->getSchemes(), '->load preserves class route schemes');
209+
$this->assertEquals($classRouteData['methods'], $route->getMethods(), '->load preserves class route methods');
210+
}
211+
212+
public function testInvokableClassMultipleRouteLoad()
213+
{
214+
$classRouteData1 = array(
215+
'name' => 'route1',
216+
'path' => '/1',
217+
'schemes' => array('https'),
218+
'methods' => array('GET'),
219+
);
220+
221+
$classRouteData2 = array(
222+
'name' => 'route2',
223+
'path' => '/2',
224+
'schemes' => array('https'),
225+
'methods' => array('GET'),
226+
);
227+
228+
$this->reader
229+
->expects($this->exactly(1))
230+
->method('getClassAnnotations')
231+
->will($this->returnValue(array($this->getAnnotatedRoute($classRouteData1), $this->getAnnotatedRoute($classRouteData2))))
232+
;
233+
$this->reader
234+
->expects($this->once())
235+
->method('getMethodAnnotations')
236+
->will($this->returnValue(array()))
237+
;
238+
239+
$routeCollection = $this->loader->load('Symfony\Component\Routing\Tests\Fixtures\AnnotatedClasses\BazClass');
240+
$route = $routeCollection->get($classRouteData1['name']);
241+
242+
$this->assertSame($classRouteData1['path'], $route->getPath(), '->load preserves class route path');
243+
$this->assertEquals($classRouteData1['schemes'], $route->getSchemes(), '->load preserves class route schemes');
244+
$this->assertEquals($classRouteData1['methods'], $route->getMethods(), '->load preserves class route methods');
245+
246+
$route = $routeCollection->get($classRouteData2['name']);
247+
248+
$this->assertSame($classRouteData2['path'], $route->getPath(), '->load preserves class route path');
249+
$this->assertEquals($classRouteData2['schemes'], $route->getSchemes(), '->load preserves class route schemes');
250+
$this->assertEquals($classRouteData2['methods'], $route->getMethods(), '->load preserves class route methods');
210251
}
211252

212253
public function testInvokableClassWithMethodRouteLoad()

Tests/Loader/AnnotationDirectoryLoaderTest.php

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,14 +29,20 @@ protected function setUp()
2929

3030
public function testLoad()
3131
{
32-
$this->reader->expects($this->exactly(4))->method('getClassAnnotation');
32+
$this->reader->expects($this->exactly(3))->method('getClassAnnotation');
3333

3434
$this->reader
3535
->expects($this->any())
3636
->method('getMethodAnnotations')
3737
->will($this->returnValue(array()))
3838
;
3939

40+
$this->reader
41+
->expects($this->any())
42+
->method('getClassAnnotations')
43+
->will($this->returnValue(array()))
44+
;
45+
4046
$this->loader->load(__DIR__.'/../Fixtures/AnnotatedClasses');
4147
}
4248

@@ -45,7 +51,6 @@ public function testLoadIgnoresHiddenDirectories()
4551
$this->expectAnnotationsToBeReadFrom(array(
4652
'Symfony\Component\Routing\Tests\Fixtures\AnnotatedClasses\BarClass',
4753
'Symfony\Component\Routing\Tests\Fixtures\AnnotatedClasses\BazClass',
48-
'Symfony\Component\Routing\Tests\Fixtures\AnnotatedClasses\BazClass',
4954
'Symfony\Component\Routing\Tests\Fixtures\AnnotatedClasses\FooClass',
5055
));
5156

@@ -55,6 +60,12 @@ public function testLoadIgnoresHiddenDirectories()
5560
->will($this->returnValue(array()))
5661
;
5762

63+
$this->reader
64+
->expects($this->any())
65+
->method('getClassAnnotations')
66+
->will($this->returnValue(array()))
67+
;
68+
5869
$this->loader->load(__DIR__.'/../Fixtures/AnnotatedClasses');
5970
}
6071

0 commit comments

Comments
 (0)