Skip to content

Commit 0a6eb93

Browse files
author
Sergey Semenov
committed
MAGETWO-33075: Upgrade route class.
1 parent 685df6f commit 0a6eb93

File tree

5 files changed

+263
-104
lines changed

5 files changed

+263
-104
lines changed

app/code/Magento/Webapi/Controller/Rest/Router/Route.php

Lines changed: 136 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -7,22 +7,137 @@
77
*/
88
namespace Magento\Webapi\Controller\Rest\Router;
99

10-
class Route extends \Zend_Controller_Router_Route
10+
use Magento\Framework\App\RequestInterface as Request;
11+
use Magento\Framework\App\RouterInterface;
12+
13+
class Route implements RouterInterface
1114
{
12-
/** @var string */
13-
protected $_serviceClass;
15+
/**
16+
* @var string
17+
*/
18+
protected $serviceClass;
19+
20+
/**
21+
* @var string
22+
*/
23+
protected $serviceMethod;
24+
25+
/**
26+
* @var boolean
27+
*/
28+
protected $secure;
1429

15-
/** @var string */
16-
protected $_serviceMethod;
30+
/**
31+
* @var array
32+
*/
33+
protected $aclResources = [];
34+
35+
/**
36+
* @var array
37+
*/
38+
protected $parameters = [];
1739

18-
/** @var boolean */
19-
protected $_secure;
40+
/**
41+
* @var array
42+
*/
43+
protected $variables = [];
2044

21-
/** @var array */
22-
protected $_aclResources = [];
45+
/**
46+
* @var string
47+
*/
48+
protected $route;
2349

24-
/** @var array */
25-
protected $_parameters = [];
50+
/**
51+
* @param string $route
52+
*/
53+
public function __construct($route = '')
54+
{
55+
$this->route = trim($route, '/');
56+
}
57+
58+
/**
59+
* Split route by parts and variables
60+
*
61+
* @return array
62+
*/
63+
protected function getRouteParts()
64+
{
65+
$result = [];
66+
$routeParts = explode('/', $this->route);
67+
foreach ($routeParts as $key => $value) {
68+
if ($this->isVariable($value)) {
69+
$this->variables[$key] = substr($value, 1);
70+
$value = null;
71+
}
72+
$result[$key] = strtolower($value);
73+
}
74+
return $result;
75+
}
76+
77+
/**
78+
* Check if current route part is a name of variable
79+
*
80+
* @param string $value
81+
* @return bool
82+
*/
83+
protected function isVariable($value)
84+
{
85+
if (substr($value, 0, 1) == ':'
86+
&& substr($value, 1, 1) != ':') {
87+
return true;
88+
}
89+
return false;
90+
}
91+
92+
/**
93+
* Retrieve unified requested path
94+
*
95+
* Lowercase all path chunks, except variables names.
96+
* E.g. the path '/V1/Categories/:categoryId' will be converted to '/v1/categories/:categoryId'.
97+
*
98+
* @param string $path
99+
* @return array
100+
*/
101+
protected function getPathParts($path)
102+
{
103+
$result = explode('/', trim($path, '/'));
104+
array_walk($result, function (&$item) {
105+
$item = substr($item, 0, 1) === ":" ? $item : strtolower($item);
106+
});
107+
return $result;
108+
}
109+
110+
/**
111+
* Check if current route matches the requested path
112+
*
113+
* @param Request $request
114+
* @return array|bool
115+
*/
116+
public function match(Request $request)
117+
{
118+
/** @var \Magento\Webapi\Controller\Rest\Request $request */
119+
$pathParts = $this->getPathParts($request->getPathInfo());
120+
$routeParts = $this->getRouteParts();
121+
if (count($pathParts) <> count($routeParts)) {
122+
return false;
123+
}
124+
125+
$result = [];
126+
foreach ($pathParts as $key => $value) {
127+
if (!array_key_exists($key, $routeParts)) {
128+
return false;
129+
}
130+
$variable = isset($this->variables[$key]) ? $this->variables[$key] : null;
131+
if ($variable) {
132+
$result[$variable] = urldecode($pathParts[$key]);
133+
} else {
134+
if ($value != $routeParts[$key]) {
135+
return false;
136+
}
137+
}
138+
}
139+
return $result;
140+
}
26141

27142
/**
28143
* Set service class.
@@ -32,7 +147,7 @@ class Route extends \Zend_Controller_Router_Route
32147
*/
33148
public function setServiceClass($serviceClass)
34149
{
35-
$this->_serviceClass = $serviceClass;
150+
$this->serviceClass = $serviceClass;
36151
return $this;
37152
}
38153

@@ -43,7 +158,7 @@ public function setServiceClass($serviceClass)
43158
*/
44159
public function getServiceClass()
45160
{
46-
return $this->_serviceClass;
161+
return $this->serviceClass;
47162
}
48163

49164
/**
@@ -54,7 +169,7 @@ public function getServiceClass()
54169
*/
55170
public function setServiceMethod($serviceMethod)
56171
{
57-
$this->_serviceMethod = $serviceMethod;
172+
$this->serviceMethod = $serviceMethod;
58173
return $this;
59174
}
60175

@@ -65,7 +180,7 @@ public function setServiceMethod($serviceMethod)
65180
*/
66181
public function getServiceMethod()
67182
{
68-
return $this->_serviceMethod;
183+
return $this->serviceMethod;
69184
}
70185

71186
/**
@@ -76,7 +191,7 @@ public function getServiceMethod()
76191
*/
77192
public function setSecure($secure)
78193
{
79-
$this->_secure = $secure;
194+
$this->secure = $secure;
80195
return $this;
81196
}
82197

@@ -87,7 +202,7 @@ public function setSecure($secure)
87202
*/
88203
public function isSecure()
89204
{
90-
return $this->_secure;
205+
return $this->secure;
91206
}
92207

93208
/**
@@ -98,7 +213,7 @@ public function isSecure()
98213
*/
99214
public function setAclResources($aclResources)
100215
{
101-
$this->_aclResources = $aclResources;
216+
$this->aclResources = $aclResources;
102217
return $this;
103218
}
104219

@@ -109,7 +224,7 @@ public function setAclResources($aclResources)
109224
*/
110225
public function getAclResources()
111226
{
112-
return $this->_aclResources;
227+
return $this->aclResources;
113228
}
114229

115230
/**
@@ -120,7 +235,7 @@ public function getAclResources()
120235
*/
121236
public function setParameters($parameters)
122237
{
123-
$this->_parameters = $parameters;
238+
$this->parameters = $parameters;
124239
return $this;
125240
}
126241

@@ -131,19 +246,6 @@ public function setParameters($parameters)
131246
*/
132247
public function getParameters()
133248
{
134-
return $this->_parameters;
135-
}
136-
137-
/**
138-
* Matches a Request with parts defined by a map. Assigns and
139-
* returns an array of variables on a successful match.
140-
*
141-
* @param \Magento\Webapi\Controller\Request $request
142-
* @param boolean $partial Partial path matching
143-
* @return array|bool An array of assigned values or a boolean false on a mismatch
144-
*/
145-
public function match($request, $partial = false)
146-
{
147-
return parent::match(strtolower(ltrim($request->getPathInfo(), $this->_urlDelimiter)), $partial);
249+
return $this->parameters;
148250
}
149251
}

dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_classes.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2855,4 +2855,6 @@
28552855
['Magento\Sales\Model\Quote\Address\Total\Nominal\Shipping'],
28562856
['Magento\Sales\Model\Quote\Address\Total\Nominal\Subtotal'],
28572857
['Magento\Core\Model\Validator\Factory', 'Magento\Framework\Validator\Factory'],
2858+
['Zend_Controller_Router_Route'],
2859+
['Zend_Controller_Router_Route_Interface'],
28582860
];

dev/tests/unit/testsuite/Magento/Framework/Controller/Router/Route/FactoryTest.php

Lines changed: 28 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -6,73 +6,70 @@
66

77
namespace Magento\Framework\Controller\Router\Route;
88

9+
use Magento\Framework\Controller\Router\Route\Factory as RouteFactory;
10+
use Magento\TestFramework\Helper\ObjectManager as ObjectManager;
11+
912
class FactoryTest extends \PHPUnit_Framework_TestCase
1013
{
1114
/**
12-
* @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Framework\ObjectManagerInterface
15+
* @var ObjectManager|\PHPUnit_Framework_MockObject_MockObject
1316
*/
1417
protected $objectManager;
1518

19+
/**
20+
* @var RouteFactory|\PHPUnit_Framework_MockObject_MockObject
21+
*/
22+
protected $factory;
23+
1624
public function setUp()
1725
{
1826
$this->objectManager = $this->getMock('Magento\Framework\ObjectManagerInterface');
27+
28+
$objectManager = new ObjectManager($this);
29+
$this->factory = $objectManager->getObject(
30+
'Magento\Framework\Controller\Router\Route\Factory',
31+
[
32+
'objectManager' => $this->objectManager,
33+
]
34+
);
1935
}
2036

2137
/**
2238
* @test
39+
* @return void
2340
*/
2441
public function testCreateRoute()
2542
{
26-
$routerClass = 'router';
43+
$routeClass = 'router';
44+
$paramRoute = 'route';
2745

28-
$router = $this->getMockBuilder('Zend_Controller_Router_Route_Interface')
29-
->setMockClassName($routerClass)
46+
$router = $this->getMockBuilder('Magento\Framework\App\RouterInterface')
47+
->setMockClassName($routeClass)
3048
->getMock();
3149

32-
$parameterRoute = 'route';
33-
$parameterDefaults = 'defaults';
34-
$parameterRegs = 'regs';
35-
$parameterLocale = 'locale';
36-
3750
$this->objectManager->expects($this->once())
3851
->method('create')
39-
->with(
40-
$this->logicalOr(
41-
$routerClass,
42-
[
43-
'route' => $parameterRoute,
44-
'defaults' => $parameterDefaults,
45-
'regs' => $parameterRegs,
46-
'locale' => $parameterLocale,
47-
]
48-
)
49-
)
52+
->with($routeClass, ['route' => $paramRoute])
5053
->will($this->returnValue($router));
5154

52-
$object = new \Magento\Framework\Controller\Router\Route\Factory($this->objectManager);
53-
$expectedRouter = $object->createRoute(
54-
$routerClass,
55-
$parameterRoute,
56-
$parameterDefaults,
57-
$parameterRegs,
58-
$parameterLocale
59-
);
55+
$result = $this->factory->createRoute($routeClass, $paramRoute);
6056

61-
$this->assertInstanceOf($routerClass, $expectedRouter);
62-
$this->assertInstanceOf('Zend_Controller_Router_Route_Interface', $expectedRouter);
57+
$this->assertInstanceOf($routeClass, $result);
58+
$this->assertInstanceOf('Magento\Framework\App\RouterInterface', $result);
6359
}
6460

6561
/**
6662
* @test
6763
* @expectedException \LogicException
64+
* @return void
6865
*/
6966
public function testCreateRouteNegative()
7067
{
7168
$this->objectManager->expects($this->once())
7269
->method('create')
7370
->will($this->returnValue(new \StdClass()));
7471

75-
$object = new \Magento\Framework\Controller\Router\Route\Factory($this->objectManager);
72+
$object = new Factory($this->objectManager);
7673
$object->createRoute(
7774
'routerClass',
7875
'router'

0 commit comments

Comments
 (0)