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

Commit d3ae963

Browse files
committed
Refactoring, added test from @abinici
1 parent 3e54fc3 commit d3ae963

11 files changed

+125
-51
lines changed

AutoRoute/AutoRouteManager.php

Lines changed: 22 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ class AutoRouteManager
2727
protected $urlGenerator;
2828
protected $defunctRouteHandler;
2929

30-
private $defunctRouteStack = array();
30+
private $pendingOperationStacks = array();
3131

3232
/**
3333
* @param AdapterInterface $adapter Database adapter
@@ -48,57 +48,54 @@ public function __construct(
4848
/**
4949
* @param object $document
5050
*/
51-
public function buildOperationStack(OperationStack $operationStack, $document)
51+
public function buildOperationStack(OperationStack $operationStack)
5252
{
53-
$urls = $this->getUrlsForDocument($document);
53+
$this->getUrlContextsForDocument($operationStack);
5454

55-
foreach ($urls as $url) {
56-
$existingRoute = $this->adapter->findRouteForUrl($url);
55+
foreach ($operationStack->getUrlContexts() as $urlContext) {
56+
$existingRoute = $this->adapter->findRouteForUrl($urlContext->getUrl());
5757

5858
if ($existingRoute) {
59-
$isSameContent = $this->adapter->compareRouteContent($existingRoute, $document);
59+
$isSameContent = $this->adapter->compareRouteContent($existingRoute, $urlContext->getSubjectObject());
6060

6161
if ($isSameContent) {
6262
continue;
6363
}
6464

65-
$url = $this->urlGenerator->resolveConflict($document, $url);
65+
$url = $this->urlGenerator->resolveConflict($urlContext->getUrl());
6666
}
6767

68-
$newRoute = $this->adapter->createRoute($url, $document);
69-
$operationStack->pushNewRoute($newRoute);
68+
$newRoute = $this->adapter->createRoute($urlContext->getUrl(), $urlContext->getSubjectObject());
69+
$urlContext->setNewRoute($newRoute);
7070
}
7171

72-
$this->defunctRouteStack[] = array($document, $operationStack);
73-
74-
// do we really need the operation stack now? We can just persist...
75-
return $operationStack;
72+
$this->pendingOperationStacks[] = $operationStack;
7673
}
7774

7875
public function handleDefunctRoutes()
7976
{
80-
while ($defunctRoute = array_pop($this->defunctRouteStack)) {
81-
list ($document, $operationStack) = $defunctRoute;
82-
$this->defunctRouteHandler->handleDefunctRoutes($document, $operationStack);
77+
while ($operationStack = array_pop($this->pendingOperationStacks)) {
78+
$this->defunctRouteHandler->handleDefunctRoutes($operationStack);
8379
}
8480
}
8581

86-
private function getUrlsForDocument($document)
82+
private function getUrlContextsForDocument(OperationStack $operationStack)
8783
{
88-
$urls = array();
89-
$locales = $this->adapter->getLocales($document) ? : array(null);
84+
$locales = $this->adapter->getLocales($operationStack->getSubjectObject()) ? : array(null);
9085

9186
foreach ($locales as $locale) {
92-
$urlContext = new UrlContext($document, $locale);
93-
9487
if (null !== $locale) {
95-
$this->adapter->translateObject($document, $locale);
88+
$this->adapter->translateObject($operationStack->getSubjectObject(), $locale);
9689
}
9790

91+
// create and add url context to stack
92+
$urlContext = $operationStack->createUrlContext($locale);
9893

99-
$urls[] = $this->urlGenerator->generateUrl($urlContext);
100-
}
94+
// generate the URL
95+
$url = $this->urlGenerator->generateUrl($urlContext);
10196

102-
return $urls;
97+
// update the context with the URL
98+
$urlContext->setUrl($url);
99+
}
103100
}
104101
}

AutoRoute/ConflictResolverInterface.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
namespace Symfony\Cmf\Bundle\RoutingAutoBundle\AutoRoute;
44

5+
use Symfony\Cmf\Bundle\RoutingAutoBundle\AutoRoute\UrlContext;
6+
57
interface ConflictResolverInterface
68
{
79
/**
@@ -12,6 +14,6 @@ interface ConflictResolverInterface
1214
*
1315
* @return string unconflicted URL
1416
*/
15-
public function resolveConflict($url);
17+
public function resolveConflict(UrlContext $urlContext);
1618

1719
}

AutoRoute/DefunctRouteHandler.php

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -42,16 +42,24 @@ public function __construct(
4242
/**
4343
* {@inheritDoc}
4444
*/
45-
public function handleDefunctRoutes($document, OperationStack $operationStack)
45+
public function handleDefunctRoutes(OperationStack $operationStack)
4646
{
47-
$referrerCollection = $this->adapter->getReferringRoutes($document);
47+
$referrerCollection = $this->adapter->getReferringRoutes($operationStack->getSubjectObject());
4848

4949
foreach ($referrerCollection as $referrer) {
50-
if (!$operationStack->containsRoute($referrer)) {
51-
if (!$canonicalRoutes = $operationStack->getPersistStack()) {
50+
if (false === $operationStack->containsRoute($referrer)) {
51+
$urlContexts = $operationStack->getUrlContexts();
52+
if (!$urlContexts) {
5253
continue;
5354
}
54-
$this->adapter->removeDefunctRoute($referrer, $canonicalRoutes[0]);
55+
56+
$canonicalRoute = $urlContexts[0]->getNewRoute();
57+
58+
if (!$canonicalRoute) {
59+
continue;
60+
}
61+
62+
$this->adapter->removeDefunctRoute($referrer, $canonicalRoute);
5563
}
5664
}
5765
}

AutoRoute/DefunctRouteHandlerInterface.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,5 +22,5 @@ interface DefunctRouteHandlerInterface
2222
*
2323
* TODO
2424
*/
25-
public function handleDefunctRoutes($document, OperationStack $operationStack);
25+
public function handleDefunctRoutes(OperationStack $operationStack);
2626
}

AutoRoute/OperationStack.php

Lines changed: 40 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,22 +6,56 @@
66

77
class OperationStack
88
{
9-
protected $persistStack = array();
9+
protected $subjectObject;
10+
protected $urlContexts = array();
11+
12+
/**
13+
* @param mixed $subjectObject Subject for URL generation
14+
*/
15+
public function __construct($subjectObject)
16+
{
17+
$this->subjectObject = $subjectObject;
18+
}
19+
20+
public function getSubjectObject()
21+
{
22+
return $this->subjectObject;
23+
}
1024

1125
public function pushNewRoute(RouteObjectInterface $route)
1226
{
1327
$this->persistStack[] = $route;
1428
}
1529

16-
public function getPersistStack()
30+
/**
31+
* Create and add a URL context
32+
*
33+
* @param string $url URL
34+
* @param string $locale Locale for given URL
35+
*
36+
* @return UrlContext
37+
*/
38+
public function createUrlContext($locale)
39+
{
40+
$urlContext = new UrlContext(
41+
$this->getSubjectObject(),
42+
$locale
43+
);
44+
45+
$this->urlContexts[] = $urlContext;
46+
47+
return $urlContext;
48+
}
49+
50+
public function getUrlContexts()
1751
{
18-
return $this->persistStack;
52+
return $this->urlContexts;
1953
}
2054

21-
public function containsRoute(RouteObjectInterface $targetRoute)
55+
public function containsRoute(RouteObjectInterface $route)
2256
{
23-
foreach ($this->persistStack as $route) {
24-
if ($route === $targetRoute) {
57+
foreach ($this->urlContexts as $urlContext) {
58+
if ($route === $urlContext->getNewRoute()) {
2559
return true;
2660
}
2761
}

AutoRoute/TokenProvider/ContentDateTimeProvider.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ class ContentDateTimeProvider extends ContentMethodProvider
1414
*/
1515
public function provideValue(UrlContext $urlContext, $options)
1616
{
17-
$object = $urlContext->getObject();
17+
$object = $urlContext->getSubjectObject();
1818
$method = $options['method'];
1919
$this->checkMethodExists($object, $method);
2020

AutoRoute/TokenProvider/ContentMethodProvider.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ protected function checkMethodExists($object, $method)
3232
*/
3333
public function provideValue(UrlContext $urlContext, $options)
3434
{
35-
$object = $urlContext->getObject();
35+
$object = $urlContext->getSubjectObject();
3636
$method = $options['method'];
3737

3838
$this->checkMethodExists($object, $method);

AutoRoute/UrlContext.php

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,22 +13,45 @@
1313
*/
1414
class UrlContext
1515
{
16-
protected $object;
16+
protected $subjectObject;
1717
protected $locale;
18+
protected $url;
19+
protected $newRoute;
1820

19-
public function __construct($object, $locale)
21+
public function __construct($subjectObject, $locale)
2022
{
21-
$this->object = $object;
23+
$this->subjectObject = $subjectObject;
2224
$this->locale = $locale;
2325
}
2426

25-
public function getObject()
27+
public function getUrl()
2628
{
27-
return $this->object;
29+
return $this->url;
30+
}
31+
32+
public function setUrl($url)
33+
{
34+
$this->url = $url;
35+
}
36+
37+
public function getSubjectObject()
38+
{
39+
return $this->subjectObject;
2840
}
2941

3042
public function getLocale()
3143
{
3244
return $this->locale;
3345
}
46+
47+
public function getNewRoute()
48+
{
49+
return $this->newRoute;
50+
}
51+
52+
public function setNewRoute($newRoute)
53+
{
54+
$this->newRoute = $newRoute;
55+
}
56+
3457
}

AutoRoute/UrlGenerator.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
use Symfony\Cmf\Bundle\RoutingAutoBundle\AutoRoute\Adapter\AdapterInterface;
66
use Metadata\MetadataFactoryInterface;
77
use Symfony\Component\OptionsResolver\OptionsResolver;
8+
use Symfony\Cmf\Bundle\RoutingAutoBundle\AutoRoute\UrlContext;
89

910
/**
1011
* Class which handles URL generation and conflict resolution
@@ -38,7 +39,7 @@ public function __construct(
3839
*/
3940
public function generateUrl(UrlContext $urlContext)
4041
{
41-
$realClassName = $this->driver->getRealClassName(get_class($urlContext->getObject()));
42+
$realClassName = $this->driver->getRealClassName(get_class($urlContext->getSubjectObject()));
4243
$metadata = $this->metadataFactory->getMetadataForClass($realClassName);
4344

4445
$tokenProviderConfigs = $metadata->getTokenProviders();
@@ -66,7 +67,7 @@ public function generateUrl(UrlContext $urlContext)
6667
*/
6768
public function resolveConflict(UrlContext $urlContext)
6869
{
69-
$realClassName = $this->driver->getRealClassName($urlContext->getObject());
70+
$realClassName = $this->driver->getRealClassName($urlContext->getSubjectObject());
7071
$metadata = $this->factory->getMetadataForClass($realClassName);
7172

7273
list ($name, $config) = $metadata->getConflictResolverConfig();

Doctrine/Phpcr/AutoRouteListener.php

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -60,11 +60,16 @@ public function onFlush(ManagerEventArgs $args)
6060
foreach ($updates as $document) {
6161
if ($this->isAutoRouteable($document)) {
6262

63-
$operationStack = new OperationStack();
64-
$arm->buildOperationStack($operationStack, $document);
63+
$operationStack = new OperationStack($document);
64+
$arm->buildOperationStack($operationStack);
6565

66-
foreach ($operationStack->getPersistStack() as $document) {
67-
$dm->persist($document);
66+
// refactor this.
67+
foreach ($operationStack->getUrlContexts() as $urlContext) {
68+
$newRoute = $urlContext->getNewRoute();
69+
if (null === $newRoute) {
70+
continue;
71+
}
72+
$dm->persist($newRoute);
6873
$uow->computeChangeSets();
6974
}
7075
}

0 commit comments

Comments
 (0)