Skip to content

Commit 909c430

Browse files
author
Alex Paliarush
committed
MAGETWO-92260: GraphQL - Fix urlResolver query to support relative path #13
- Fixed and added tests - Resolved incorrect dependencies between modules and introduced extension point for custom URL resolver
1 parent 093f1b9 commit 909c430

File tree

8 files changed

+197
-40
lines changed

8 files changed

+197
-40
lines changed
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
declare(strict_types=1);
7+
8+
namespace Magento\CmsUrlRewriteGraphQl\Model\Resolver\UrlRewrite;
9+
10+
use Magento\UrlRewriteGraphQl\Model\Resolver\UrlRewrite\CustomUrlResolverInterface;
11+
use Magento\Store\Model\ScopeInterface;
12+
use Magento\Cms\Helper\Page;
13+
14+
/**
15+
* Home page URL resolver.
16+
*/
17+
class HomePageUrlResolver implements CustomUrlResolverInterface
18+
{
19+
/**
20+
* @var \Magento\Framework\App\Config\ScopeConfigInterface
21+
*/
22+
private $scopeConfig;
23+
24+
/**
25+
* @param \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig
26+
*/
27+
public function __construct(
28+
\Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig
29+
) {
30+
$this->scopeConfig = $scopeConfig;
31+
}
32+
33+
/**
34+
* @inheritdoc
35+
*/
36+
public function resolveUrl($urlKey): ?string
37+
{
38+
if ($urlKey === '/') {
39+
$homePageUrl = $this->scopeConfig->getValue(
40+
Page::XML_PATH_HOME_PAGE,
41+
ScopeInterface::SCOPE_STORE
42+
);
43+
return $homePageUrl;
44+
}
45+
return null;
46+
}
47+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<?xml version="1.0"?>
2+
<!--
3+
/**
4+
* Copyright © Magento, Inc. All rights reserved.
5+
* See COPYING.txt for license details.
6+
*/
7+
-->
8+
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
9+
<type name="Magento\UrlRewriteGraphQl\Model\Resolver\UrlRewrite\CustomUrlResolver">
10+
<arguments>
11+
<argument name="urlResolvers" xsi:type="array">
12+
<item name="homePageResolver" xsi:type="object">Magento\CmsUrlRewriteGraphQl\Model\Resolver\UrlRewrite\HomePageUrlResolver</item>
13+
</argument>
14+
</arguments>
15+
</type>
16+
</config>

app/code/Magento/UrlRewriteGraphQl/Model/Resolver/UrlRewrite.php

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,7 @@
1414
use Magento\Framework\GraphQl\Query\ResolverInterface;
1515
use Magento\Store\Model\StoreManagerInterface;
1616
use Magento\UrlRewrite\Model\UrlFinderInterface;
17-
use Magento\Store\Model\ScopeInterface;
18-
use Magento\Cms\Helper\Page;
17+
use Magento\UrlRewriteGraphQl\Model\Resolver\UrlRewrite\CustomUrlResolverInterface;
1918

2019
/**
2120
* UrlRewrite field resolver, used for GraphQL request processing.
@@ -38,26 +37,26 @@ class UrlRewrite implements ResolverInterface
3837
private $valueFactory;
3938

4039
/**
41-
* @var \Magento\Framework\App\Config\ScopeConfigInterface
40+
* @var UrlRewrite\CustomUrlResolverInterface
4241
*/
43-
private $scopeConfig;
44-
42+
private $customUrlResolver;
43+
4544
/**
4645
* @param UrlFinderInterface $urlFinder
4746
* @param StoreManagerInterface $storeManager
4847
* @param ValueFactory $valueFactory
49-
* @param \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig
48+
* @param CustomUrlResolverInterface $customUrlResolver
5049
*/
5150
public function __construct(
5251
UrlFinderInterface $urlFinder,
5352
StoreManagerInterface $storeManager,
5453
ValueFactory $valueFactory,
55-
\Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig
54+
CustomUrlResolverInterface $customUrlResolver
5655
) {
5756
$this->urlFinder = $urlFinder;
5857
$this->storeManager = $storeManager;
5958
$this->valueFactory = $valueFactory;
60-
$this->scopeConfig = $scopeConfig;
59+
$this->customUrlResolver = $customUrlResolver;
6160
}
6261

6362
/**
@@ -78,13 +77,9 @@ public function resolve(
7877
$url = $args['url'];
7978
if (substr($url, 0, 1) === '/' && $url !== '/') {
8079
$url = ltrim($url, '/');
81-
} else if ($url === '/') {
82-
$homePageIdentifier = $this->scopeConfig->getValue(
83-
Page::XML_PATH_HOME_PAGE,
84-
ScopeInterface::SCOPE_STORE
85-
);
86-
$url = $homePageIdentifier;
8780
}
81+
$customUrl = $this->customUrlResolver->resolveUrl($url);
82+
$url = $customUrl ?: $url;
8883
$urlRewrite = $this->findCanonicalUrl($url);
8984
if ($urlRewrite) {
9085
$urlRewriteReturnArray = [
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
declare(strict_types=1);
7+
8+
namespace Magento\UrlRewriteGraphQl\Model\Resolver\UrlRewrite;
9+
10+
/**
11+
* Pool of custom URL resolvers.
12+
*/
13+
class CustomUrlResolver implements CustomUrlResolverInterface
14+
{
15+
/**
16+
* @var CustomUrlResolverInterface[]
17+
*/
18+
private $urlResolvers;
19+
20+
/**
21+
* @param CustomUrlResolverInterface[] $urlResolvers
22+
*/
23+
public function __construct(array $urlResolvers = [])
24+
{
25+
$this->urlResolvers = $urlResolvers;
26+
}
27+
28+
/**
29+
* @inheritdoc
30+
*/
31+
public function resolveUrl($urlKey): ?string
32+
{
33+
foreach ($this->urlResolvers as $urlResolver) {
34+
$url = $urlResolver->resolveUrl($urlKey);
35+
if ($url !== null) {
36+
return $url;
37+
}
38+
}
39+
return null;
40+
}
41+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
declare(strict_types=1);
7+
8+
namespace Magento\UrlRewriteGraphQl\Model\Resolver\UrlRewrite;
9+
10+
/**
11+
* Interface for resolution of custom URLs.
12+
*
13+
* It can be used, for example, to resolve '\' URL path to a 'Home' page.
14+
*/
15+
interface CustomUrlResolverInterface
16+
{
17+
/**
18+
* Resolve URL based on custom rules.
19+
*
20+
* @param string $urlKey
21+
* @return string|null Return null if URL cannot be resolved
22+
*/
23+
public function resolveUrl($urlKey): ?string;
24+
}

app/code/Magento/UrlRewriteGraphQl/composer.json

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,7 @@
66
"php" : "~7.1.3||~7.2.0",
77
"magento/framework" : "*",
88
"magento/module-url-rewrite" : "*",
9-
"magento/module-store" : "*",
10-
"magento/cms" : "*"
9+
"magento/module-store": "*"
1110
},
1211
"suggest" : {
1312
"magento/module-graph-ql" : "*"
@@ -24,4 +23,4 @@
2423
"Magento\\UrlRewriteGraphQl\\" : ""
2524
}
2625
}
27-
}
26+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<?xml version="1.0"?>
2+
<!--
3+
/**
4+
* Copyright © Magento, Inc. All rights reserved.
5+
* See COPYING.txt for license details.
6+
*/
7+
-->
8+
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
9+
<preference for="Magento\UrlRewriteGraphQl\Model\Resolver\UrlRewrite\CustomUrlResolverInterface" type="Magento\UrlRewriteGraphQl\Model\Resolver\UrlRewrite\CustomUrlResolver"/>
10+
</config>

0 commit comments

Comments
 (0)