Skip to content
This repository was archived by the owner on Sep 16, 2021. It is now read-only.

Commit 1184bb8

Browse files
committed
Merge pull request #87 from symfony-cmf/mapping_refactor_fix
Mapping refactor fix
2 parents 92392b1 + a434d57 commit 1184bb8

File tree

7 files changed

+208
-26
lines changed

7 files changed

+208
-26
lines changed

AutoRoute/Mapping/ClassMetadata.php

Lines changed: 87 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,19 @@
2121
*/
2222
class ClassMetadata extends MergeableClassMetadata
2323
{
24+
/**
25+
* @var string
26+
*/
2427
protected $urlSchema;
28+
29+
/**
30+
* @var array
31+
*/
2532
protected $tokenProviders = array();
26-
/** @var null|array */
33+
34+
/**
35+
* @var null|array
36+
*/
2737
protected $conflictResolver;
2838

2939
/**
@@ -33,18 +43,40 @@ class ClassMetadata extends MergeableClassMetadata
3343
*/
3444
protected $defunctRouteHandler = array('name' => 'remove');
3545

36-
protected $extend;
46+
/**
47+
* @var string
48+
*/
49+
protected $extendedClass;
3750

51+
/**
52+
* Set the URL schema to use for the subject class.
53+
*
54+
* e.g. {foobar}/articles/{date}
55+
*
56+
* @param string $schema
57+
*/
3858
public function setUrlSchema($schema)
3959
{
4060
$this->urlSchema = $schema;
4161
}
4262

63+
/**
64+
* Return the URL schema
65+
*
66+
* @return string
67+
*/
4368
public function getUrlSchema()
4469
{
4570
return $this->urlSchema;
4671
}
4772

73+
/**
74+
* Add a token provider configfuration.
75+
*
76+
* @param string $tokenName
77+
* @param array $provider
78+
* @param boolean $override
79+
*/
4880
public function addTokenProvider($tokenName, array $provider = array(), $override = false)
4981
{
5082
if ('schema' === $tokenName) {
@@ -58,21 +90,44 @@ public function addTokenProvider($tokenName, array $provider = array(), $overrid
5890
$this->tokenProviders[$tokenName] = $provider;
5991
}
6092

93+
/**
94+
* Return an associative array of token provider configurations.
95+
* Keys are the token provider names, values are configurations in
96+
* array format.
97+
*
98+
* @return array
99+
*/
61100
public function getTokenProviders()
62101
{
63102
return $this->tokenProviders;
64103
}
65104

105+
/**
106+
* Set the conflict resolver configuration.
107+
*
108+
* @param array
109+
*/
66110
public function setConflictResolver($conflictResolver)
67111
{
68112
$this->conflictResolver = $conflictResolver;
69113
}
70114

115+
/**
116+
* Return the conflict resolver configuration.
117+
*
118+
* @return array
119+
*/
71120
public function getConflictResolver()
72121
{
73122
return $this->conflictResolver;
74123
}
75124

125+
/**
126+
* Return true if a conflict resolver configuration
127+
* has been registered.
128+
*
129+
* @return boolean
130+
*/
76131
public function hasConflictResolver()
77132
{
78133
return null !== $this->conflictResolver;
@@ -100,21 +155,41 @@ public function getDefunctRouteHandler()
100155
return $this->defunctRouteHandler;
101156
}
102157

158+
/**
159+
* Return true if a defunct route handler has been set.
160+
*
161+
* @return boolean
162+
*/
103163
public function hasDefunctRouteHandler()
104164
{
105165
return null !== $this->defunctRouteHandler;
106166
}
107167

168+
/**
169+
* Extend the metadata of the mapped class with given $name
170+
*
171+
* @param string $name
172+
*/
108173
public function setExtendedClass($name)
109174
{
110-
$this->extend = $name;
175+
$this->extendedClass = $name;
111176
}
112177

178+
/**
179+
* Return the name of the extended class (if any)
180+
*
181+
* @return string
182+
*/
113183
public function getExtendedClass()
114184
{
115-
return $this->extend;
185+
return $this->extendedClass;
116186
}
117187

188+
/**
189+
* Return the name of the subject class
190+
*
191+
* @return string
192+
*/
118193
public function getClassName()
119194
{
120195
return $this->name;
@@ -140,5 +215,13 @@ public function merge(MergeableInterface $metadata)
140215
foreach ($metadata->getTokenProviders() as $tokenName => $provider) {
141216
$this->addTokenProvider($tokenName, $provider, true);
142217
}
218+
219+
if ($defunctRouteHandler = $metadata->getDefunctRouteHandler()) {
220+
$this->setDefunctRouteHandler($defunctRouteHandler);
221+
}
222+
223+
if ($conflictResolver = $metadata->getConflictResolver()) {
224+
$this->setConflictResolver($conflictResolver);
225+
}
143226
}
144227
}

AutoRoute/Mapping/Loader/XmlFileLoader.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
use Symfony\Component\Config\Loader\FileLoader;
1717

1818
/**
19+
* Loader for XML files
20+
*
1921
* @author Wouter J <[email protected]>
2022
*/
2123
class XmlFileLoader extends FileLoader

AutoRoute/Mapping/Loader/YmlFileLoader.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,9 @@
2020
*/
2121
class YmlFileLoader extends FileLoader
2222
{
23-
/** @var null|YamlParser */
23+
/**
24+
* @var null|YamlParser
25+
*/
2426
private $parser;
2527

2628
/**

AutoRoute/Mapping/MetadataFactory.php

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,19 @@
2222
*/
2323
class MetadataFactory implements \IteratorAggregate, MetadataFactoryInterface
2424
{
25-
/** @var ClassMetadata[] */
25+
/**
26+
* @var ClassMetadata[]
27+
*/
2628
protected $metadatas = array();
27-
/** @var ClassMetadata[] */
29+
30+
/**
31+
* @var ClassMetadata[]
32+
*/
2833
protected $resolvedMetadatas = array();
29-
/** @var null|CacheInterface */
34+
35+
/**
36+
* @var null|CacheInterface
37+
*/
3038
protected $cache;
3139

3240
/**
@@ -86,7 +94,6 @@ protected function resolveMetadata($class)
8694
{
8795
$classFqns = class_parents($class);
8896
$classFqns[] = $class;
89-
$classFqns = array_reverse($classFqns);
9097
$metadatas = array();
9198
$addedClasses = array();
9299

@@ -123,9 +130,10 @@ protected function doResolve($classFqn, array &$addedClasses)
123130
if (isset($this->metadatas[$classFqn])) {
124131
$currentMetadata = $this->metadatas[$classFqn];
125132
$addedClasses[] = $classFqn;
133+
$extendedClass = $currentMetadata->getExtendedClass();
126134

127-
if (isset($this->metadatas[$extend = $currentMetadata->getExtendedClass()])) {
128-
foreach ($this->doResolve($extend, $addedClasses) as $extendData) {
135+
if (isset($this->metadatas[$extendedClass])) {
136+
foreach ($this->doResolve($extendedClass, $addedClasses) as $extendData) {
129137
$metadatas[] = $extendData;
130138
}
131139
}

AutoRoute/Mapping/MetadataFactoryBuilder.php

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,20 +13,40 @@
1313

1414
use Symfony\Component\Config\Loader\LoaderInterface;
1515

16+
/**
17+
* MetaFactoryBuilder
18+
*
19+
* @author Wouter J <[email protected]>
20+
*/
1621
class MetadataFactoryBuilder
1722
{
18-
/** @var array */
23+
/**
24+
* @var array
25+
*/
1926
protected $resources;
20-
/** @var LoaderInterface */
27+
28+
/**
29+
* @var LoaderInterface
30+
*/
2131
protected $loader;
2232

33+
/**
34+
* @param LoaderInterface $loader
35+
* @param array $resources
36+
*/
2337
public function __construct(LoaderInterface $loader, array $resources)
2438
{
2539
$this->loader = $loader;
2640
$this->resources = $resources;
2741
}
2842

43+
/**
44+
* Return the metadata factory
45+
*
46+
* @return MetadataFactory
47+
*/
2948
public function getMetadataFactory()
49+
3050
{
3151
$mappingFactory = new MetadataFactory();
3252

Tests/Functional/EventListener/AutoRouteListenerTest.php

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -328,16 +328,16 @@ public function provideLeaveRedirect()
328328
'es' => 'Adios todo el mundo',
329329
),
330330
array(
331-
'test/auto-route/articles/en/hello-everybody',
332-
'test/auto-route/articles/fr/bonjour-le-monde',
333-
'test/auto-route/articles/de/gutentag',
334-
'test/auto-route/articles/es/hola-todo-el-mundo',
331+
'test/auto-route/seo-articles/en/hello-everybody',
332+
'test/auto-route/seo-articles/fr/bonjour-le-monde',
333+
'test/auto-route/seo-articles/de/gutentag',
334+
'test/auto-route/seo-articles/es/hola-todo-el-mundo',
335335
),
336336
array(
337-
'test/auto-route/articles/en/goodbye-everybody',
338-
'test/auto-route/articles/fr/aurevoir-le-monde',
339-
'test/auto-route/articles/de/aud-weidersehn',
340-
'test/auto-route/articles/es/adios-todo-el-mundo',
337+
'test/auto-route/seo-articles/en/goodbye-everybody',
338+
'test/auto-route/seo-articles/fr/aurevoir-le-monde',
339+
'test/auto-route/seo-articles/de/aud-weidersehn',
340+
'test/auto-route/seo-articles/es/adios-todo-el-mundo',
341341
),
342342
),
343343
);
@@ -369,9 +369,6 @@ public function testLeaveRedirect($data, $updatedData, $expectedRedirectRoutePat
369369
$this->getDm()->persist($article);
370370
$this->getDm()->flush();
371371

372-
// additional flush -- maybe we should handle this with an event listener of some sort?
373-
$this->getDm()->flush();
374-
375372
foreach ($expectedRedirectRoutePaths as $originalPath) {
376373
$redirectRoute = $this->getDm()->find('Symfony\Cmf\Bundle\RoutingBundle\Model\RedirectRoute', $originalPath);
377374
$this->assertNotNull($redirectRoute, 'Redirect exists for: ' . $originalPath);

Tests/Unit/AutoRoute/Mapping/MetadataFactoryTest.php

Lines changed: 72 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,79 @@ public function testStoreAndGetClassMetadata()
3838
$this->assertSame($classMetadata, $this->factory->getMetadataForClass('stdClass'));
3939
}
4040

41+
public function provideTestMerge()
42+
{
43+
return array(
44+
array(
45+
array(
46+
'defunctRouteHandler' => null,
47+
'conflictResolver' => null,
48+
),
49+
array(
50+
'defunctRouteHandler' => null,
51+
'conflictResolver' => null,
52+
),
53+
array(
54+
'defunctRouteHandler' => null,
55+
'conflictResolver' => null,
56+
),
57+
),
58+
59+
array(
60+
array(
61+
'defunctRouteHandler' => array('name' => 'defunct1'),
62+
'conflictResolver' => array('name' => 'conflict1'),
63+
),
64+
array(
65+
'defunctRouteHandler' => null,
66+
'conflictResolver' => null,
67+
),
68+
array(
69+
'defunctRouteHandler' => array('name' => 'defunct1'),
70+
'conflictResolver' => array('name' => 'conflict1'),
71+
),
72+
),
73+
74+
array(
75+
array(
76+
'defunctRouteHandler' => null,
77+
'conflictResolver' => null,
78+
),
79+
array(
80+
'defunctRouteHandler' => array('name' => 'defunct1'),
81+
'conflictResolver' => array('name' => 'conflict1'),
82+
),
83+
array(
84+
'defunctRouteHandler' => array('name' => 'defunct1'),
85+
'conflictResolver' => array('name' => 'conflict1'),
86+
),
87+
),
88+
);
89+
}
90+
91+
/**
92+
* @dataProvider provideTestMerge
93+
*/
94+
public function testMerge($parentData, $childData, $expectedData)
95+
{
96+
$parentMetadata = new ClassMetadata('Symfony\Cmf\Bundle\RoutingAutoBundle\Tests\Resources\Fixtures\ParentClass');
97+
$parentMetadata->setDefunctRouteHandler($parentData['defunctRouteHandler']);
98+
$parentMetadata->setConflictResolver($parentData['conflictResolver']);
99+
100+
$childMetadata = new ClassMetadata('Symfony\Cmf\Bundle\RoutingAutoBundle\Tests\Resources\Fixtures\ChildClass');
101+
$childMetadata->setDefunctRouteHandler($childData['defunctRouteHandler']);
102+
$childMetadata->setConflictResolver($childData['conflictResolver']);
103+
104+
$this->factory->addMetadatas(array($childMetadata, $parentMetadata));
105+
106+
$resolvedMetadata = $this->factory->getMetadataForClass('Symfony\Cmf\Bundle\RoutingAutoBundle\Tests\Resources\Fixtures\ChildClass');
107+
108+
$this->assertSame($expectedData['defunctRouteHandler'], $resolvedMetadata->getDefunctRouteHandler());
109+
$this->assertSame($expectedData['conflictResolver'], $resolvedMetadata->getConflictResolver());
110+
}
111+
41112
public function testMergingParentClasses()
42113
{
43-
$this->markTestSkipped('todo');
44-
return;
45114
$childMetadata = new ClassMetadata('Symfony\Cmf\Bundle\RoutingAutoBundle\Tests\Resources\Fixtures\ChildClass');
46115
$childMetadata->setUrlSchema('{parent}/{title}');
47116
$childTokenProvider = $this->createTokenProvider('provider1');
@@ -60,6 +129,7 @@ public function testMergingParentClasses()
60129

61130
$resolvedMetadata = $this->factory->getMetadataForClass('Symfony\Cmf\Bundle\RoutingAutoBundle\Tests\Resources\Fixtures\ChildClass');
62131
$resolvedProviders = $resolvedMetadata->getTokenProviders();
132+
63133
$this->assertSame($childTokenProvider, $resolvedProviders['category']);
64134
$this->assertSame($childTokenProviderTitle, $resolvedProviders['title']);
65135
$this->assertSame($parentTokenProviderDate, $resolvedProviders['publish_date']);

0 commit comments

Comments
 (0)