Skip to content

Commit 9c46f77

Browse files
author
Ievgen Shakhsuvarov
committed
MAGETWO-37951: Internal Server error on clicking Continue on Billing information
1 parent d38661d commit 9c46f77

File tree

7 files changed

+177
-1
lines changed

7 files changed

+177
-1
lines changed

setup/src/Magento/Setup/Console/Command/DiCompileCommand.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,13 +101,20 @@ protected function execute(InputInterface $input, OutputInterface $output)
101101
'application' => '#^' . $appCodePath . '/[\\w]+/[\\w]+/Test#',
102102
'framework' => '#^' . $libraryPath . '/[\\w]+/[\\w]+/([\\w]+/)?Test#'
103103
];
104+
$dataAttributesIncludePattern = [
105+
'service_data_attributes' => '/\/etc\/([a-zA-Z_]*\/service_data_attributes|service_data_attributes)\.xml$/'
106+
];
104107
$this->configureObjectManager($output);
105108

106109
$operations = [
107110
OperationFactory::REPOSITORY_GENERATOR => [
108111
'path' => $compiledPathsList['application'],
109112
'filePatterns' => ['di' => '/\/etc\/([a-zA-Z_]*\/di|di)\.xml$/']
110113
],
114+
OperationFactory::DATA_ATTRIBUTES_GENERATOR => [
115+
'path' => $compiledPathsList['application'],
116+
'filePatterns' => $dataAttributesIncludePattern
117+
],
111118
OperationFactory::APPLICATION_CODE_GENERATOR => [
112119
$compiledPathsList['application'],
113120
$compiledPathsList['library'],
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
<?php
2+
/**
3+
* Copyright © 2015 Magento. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
7+
namespace Magento\Setup\Module\Di\App\Task\Operation;
8+
9+
use Magento\Setup\Module\Di\App\Task\OperationInterface;
10+
use Magento\Setup\Module\Di\Code\Scanner;
11+
12+
/**
13+
* Class ServiceDataAttributesGenerator
14+
*
15+
* Generates extension classes for data objects.
16+
*/
17+
class ServiceDataAttributesGenerator implements OperationInterface
18+
{
19+
/**
20+
* @var Scanner\DirectoryScanner
21+
*/
22+
private $directoryScanner;
23+
24+
/**
25+
* @var Scanner\ServiceDataAttributesScanner
26+
*/
27+
private $serviceDataAttributesScanner;
28+
29+
/**
30+
* @var array
31+
*/
32+
private $data;
33+
34+
/**
35+
* @param Scanner\DirectoryScanner $directoryScanner
36+
* @param Scanner\ServiceDataAttributesScanner $repositoryScanner
37+
* @param array $data
38+
*/
39+
public function __construct(
40+
Scanner\DirectoryScanner $directoryScanner,
41+
Scanner\ServiceDataAttributesScanner $repositoryScanner,
42+
$data = []
43+
) {
44+
$this->directoryScanner = $directoryScanner;
45+
$this->serviceDataAttributesScanner = $repositoryScanner;
46+
$this->data = $data;
47+
}
48+
49+
/**
50+
* Processes operation task
51+
*
52+
* @return void
53+
*/
54+
public function doOperation()
55+
{
56+
if (array_diff(array_keys($this->data), ['filePatterns', 'path'])
57+
!== array_diff(['filePatterns', 'path'], array_keys($this->data))) {
58+
return;
59+
}
60+
61+
$files = $this->directoryScanner->scan($this->data['path'], $this->data['filePatterns']);
62+
$repositories = $this->serviceDataAttributesScanner->collectEntities($files['service_data_attributes']);
63+
foreach ($repositories as $entityName) {
64+
class_exists($entityName);
65+
}
66+
}
67+
}

setup/src/Magento/Setup/Module/Di/App/Task/OperationFactory.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,11 @@ class OperationFactory
3232
*/
3333
const REPOSITORY_GENERATOR = 'repository_generator';
3434

35+
/**
36+
* Service data attributes generator
37+
*/
38+
const DATA_ATTRIBUTES_GENERATOR = 'service_data_attributes_generator';
39+
3540
/**
3641
* Application code generator
3742
*/
@@ -43,6 +48,7 @@ class OperationFactory
4348
* @var array
4449
*/
4550
private $operationsDefinitions = [
51+
self::DATA_ATTRIBUTES_GENERATOR => 'Magento\Setup\Module\Di\App\Task\Operation\ServiceDataAttributesGenerator',
4652
self::AREA_CONFIG_GENERATOR => 'Magento\Setup\Module\Di\App\Task\Operation\Area',
4753
self::APPLICATION_CODE_GENERATOR => 'Magento\Setup\Module\Di\App\Task\Operation\ApplicationCodeGenerator',
4854
self::INTERCEPTION => 'Magento\Setup\Module\Di\App\Task\Operation\Interception',
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
<?php
2+
/**
3+
* Copyright © 2015 Magento. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
namespace Magento\Setup\Module\Di\Code\Scanner;
7+
8+
/**
9+
* Class ServiceDataAttributesScanner
10+
*/
11+
class ServiceDataAttributesScanner implements ScannerInterface
12+
{
13+
/**
14+
* Scan provided service_data_attributes.xml and find extenstion classes.
15+
*
16+
* @param array $files
17+
* @return array
18+
*/
19+
public function collectEntities(array $files)
20+
{
21+
$extensionClasses = [];
22+
foreach ($files as $fileName) {
23+
$dom = new \DOMDocument();
24+
$dom->loadXML(file_get_contents($fileName));
25+
$xpath = new \DOMXPath($dom);
26+
/** @var $node \DOMNode */
27+
foreach ($xpath->query('//extension_attributes') as $node) {
28+
$forType = $node->attributes->getNamedItem('for')->nodeValue;
29+
$extensionClasses[] = str_replace('Interface', 'ExtensionInterface', $forType);
30+
$extensionClasses[] = str_replace('Interface', 'Extension', $forType);
31+
}
32+
}
33+
return $extensionClasses;
34+
}
35+
}

setup/src/Magento/Setup/Test/Unit/Console/Command/DiCompileCommandTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ public function testExecute()
7373
{
7474
$this->deploymentConfig->expects($this->once())->method('isAvailable')->willReturn(true);
7575
$this->objectManager->expects($this->once())->method('configure');
76-
$this->manager->expects($this->exactly(5))->method('addOperation');
76+
$this->manager->expects($this->exactly(6))->method('addOperation');
7777
$this->manager->expects($this->once())->method('process');
7878
$tester = new CommandTester($this->command);
7979
$tester->execute([]);
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
<?php
2+
/**
3+
* Copyright © 2015 Magento. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
7+
namespace Magento\Setup\Test\Unit\Module\Di\Code\Scanner;
8+
9+
use \Magento\Setup\Module\Di\Code\Scanner\ServiceDataAttributesScanner;
10+
11+
class ServiceDataAttributesScannerTest extends \PHPUnit_Framework_TestCase
12+
{
13+
/**
14+
* @var \Magento\Setup\Module\Di\Code\Scanner\ServiceDataAttributesScanner
15+
*/
16+
protected $model;
17+
18+
protected function setUp()
19+
{
20+
$this->model = new ServiceDataAttributesScanner();
21+
}
22+
23+
public function testCollectEntities()
24+
{
25+
$files = [realpath('../../_files/service_data_attributes.xml')];
26+
$expectedResult = [
27+
'Magento\Sales\Api\Data\OrderExtensionInterface',
28+
'Magento\Sales\Api\Data\OrderExtension',
29+
'Magento\Sales\Api\Data\OrderItemExtensionInterface',
30+
'Magento\Sales\Api\Data\OrderItemExtension',
31+
'Magento\GiftMessage\Api\Data\MessageExtensionInterface',
32+
'Magento\GiftMessage\Api\Data\MessageExtension',
33+
'Magento\Quote\Api\Data\TotalsAdditionalDataExtensionInterface',
34+
'Magento\Quote\Api\Data\TotalsAdditionalDataExtension'
35+
];
36+
37+
$this->assertEquals($expectedResult, $this->model->collectEntities($files));
38+
}
39+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
<?xml version="1.0"?>
2+
<!--
3+
/**
4+
* Copyright © 2015 Magento. 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="../../../../../lib/internal/Magento/Framework/Api/etc/service_data_attributes.xsd">
9+
<extension_attributes for="Magento\Sales\Api\Data\OrderInterface">
10+
<attribute code="gift_message" type="Magento\GiftMessage\Api\Data\MessageInterface" />
11+
</extension_attributes>
12+
<extension_attributes for="Magento\Sales\Api\Data\OrderItemInterface">
13+
<attribute code="gift_message" type="Magento\GiftMessage\Api\Data\MessageInterface" />
14+
</extension_attributes>
15+
<extension_attributes for="Magento\GiftMessage\Api\Data\MessageInterface">
16+
<attribute code="entity_id" type="string" />
17+
<attribute code="entity_type" type="string" />
18+
</extension_attributes>
19+
<extension_attributes for="Magento\Quote\Api\Data\TotalsAdditionalDataInterface">
20+
<attribute code="gift_messages" type="Magento\GiftMessage\Api\Data\MessageInterface[]" />
21+
</extension_attributes>
22+
</config>

0 commit comments

Comments
 (0)