Skip to content

Commit 4e0303f

Browse files
committed
Merge remote-tracking branch 'af/B2B-2658-hydrator' into B2B-2658
2 parents 6bc61ea + e81dd16 commit 4e0303f

File tree

3 files changed

+49
-7
lines changed

3 files changed

+49
-7
lines changed

app/code/Magento/GraphQlResolverCache/Model/Resolver/Result/HydratorDehydratorProvider.php

Lines changed: 43 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
namespace Magento\GraphQlResolverCache\Model\Resolver\Result;
99

10+
use Magento\Framework\Exception\ConfigurationMismatchException;
1011
use Magento\Framework\GraphQl\Query\ResolverInterface;
1112
use Magento\Framework\ObjectManagerInterface;
1213

@@ -64,7 +65,11 @@ public function getDehydratorForResolver(ResolverInterface $resolver): ?Dehydrat
6465
if (array_key_exists($resolverClass, $this->dehydratorInstances)) {
6566
return $this->dehydratorInstances[$resolverClass];
6667
}
67-
$resolverDehydrators = $this->getInstancesForResolver($resolver, $this->dehydratorConfig);
68+
$resolverDehydrators = $this->getInstancesForResolver(
69+
$resolver,
70+
$this->dehydratorConfig,
71+
DehydratorInterface::class
72+
);
6873
if (empty($resolverDehydrators)) {
6974
$this->dehydratorInstances[$resolverClass] = null;
7075
} else {
@@ -87,7 +92,11 @@ public function getHydratorForResolver(ResolverInterface $resolver): ?HydratorIn
8792
if (array_key_exists($resolverClass, $this->hydratorInstances)) {
8893
return $this->hydratorInstances[$resolverClass];
8994
}
90-
$resolverHydrators = $this->getInstancesForResolver($resolver, $this->hydratorConfig);
95+
$resolverHydrators = $this->getInstancesForResolver(
96+
$resolver,
97+
$this->hydratorConfig,
98+
HydratorInterface::class
99+
);
91100
if (empty($resolverHydrators)) {
92101
$this->hydratorInstances[$resolverClass] = null;
93102
} else {
@@ -117,10 +126,15 @@ private function getResolverClass(ResolverInterface $resolver): string
117126
*
118127
* @param ResolverInterface $resolver
119128
* @param array $classesConfig
129+
* @param string $interfaceName
120130
* @return array
131+
* @throws ConfigurationMismatchException
121132
*/
122-
private function getInstancesForResolver(ResolverInterface $resolver, array $classesConfig): array
123-
{
133+
private function getInstancesForResolver(
134+
ResolverInterface $resolver,
135+
array $classesConfig,
136+
string $interfaceName
137+
): array {
124138
$resolverClassesConfig = [];
125139
foreach ($this->getResolverClassChain($resolver) as $resolverClass) {
126140
if (isset($classesConfig[$resolverClass])) {
@@ -131,9 +145,32 @@ private function getInstancesForResolver(ResolverInterface $resolver, array $cla
131145
return [];
132146
}
133147
$dataProcessingClassList = [];
134-
foreach ($resolverClassesConfig as $classChain) {
148+
foreach ($resolverClassesConfig as $resolverClass => $classChain) {
135149
foreach ($classChain as $classData) {
136-
$dataProcessingClassList[] = $classData;
150+
if (is_a($classData['class'], $interfaceName, true)) {
151+
$dataProcessingClassList[] = $classData;
152+
} else {
153+
if ($interfaceName == HydratorInterface::class) {
154+
throw new ConfigurationMismatchException(
155+
__(
156+
'Hydrator %1 configured for resolver %2 must implement %3.',
157+
$classData['class'],
158+
$resolverClass,
159+
$interfaceName
160+
)
161+
);
162+
} else {
163+
throw new ConfigurationMismatchException(
164+
__(
165+
'Dehydrator %1 configured for resolver %2 must implement %3.',
166+
$classData['class'],
167+
$resolverClass,
168+
$interfaceName
169+
)
170+
);
171+
}
172+
173+
}
137174
}
138175
}
139176
usort($dataProcessingClassList, function ($data1, $data2) {
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,4 @@
11
"GraphQL Query Resolver Results","GraphQL Query Resolver Results"
22
"Results from resolvers in GraphQL queries","Results from resolvers in GraphQL queries"
3+
"Hydrator %1 configured for resolver %2 must implement %3.","Hydrator %1 configured for resolver %2 must implement %3."
4+
"Deydrator %1 configured for resolver %2 must implement %3.","Dehydrator %1 configured for resolver %2 must implement %3."

dev/tests/integration/testsuite/Magento/GraphQlResolverCache/Model/Resolver/Result/HydratorDehydratorProviderTest.php

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@ public function testHydratorChainProvider()
9191

9292
$testModelDehydrator = $this->getMockBuilder(DehydratorInterface::class)
9393
->disableOriginalConstructor()
94+
->setMockClassName('TestResolverModelDehydrator')
9495
->onlyMethods(['dehydrate'])
9596
->getMock();
9697

@@ -103,6 +104,7 @@ public function testHydratorChainProvider()
103104

104105
$testModelHydrator = $this->getMockBuilder(HydratorInterface::class)
105106
->disableOriginalConstructor()
107+
->setMockClassName('TestResolverModelHydrator')
106108
->onlyMethods(['hydrate'])
107109
->getMock();
108110
$testModelHydrator->expects($this->once())
@@ -114,9 +116,10 @@ public function testHydratorChainProvider()
114116
});
115117
$testNestedHydrator = $this->getMockBuilder(HydratorInterface::class)
116118
->disableOriginalConstructor()
119+
->setMockClassName('TestResolverNestedItemsHydrator')
117120
->onlyMethods(['hydrate'])
118121
->getMock();
119-
$testModelHydrator->expects($this->once())
122+
$testNestedHydrator->expects($this->once())
120123
->method('hydrate')
121124
->willReturnCallback(function (&$resolverData) {
122125
$resolverData['model']->setData('nested_data', ['test_nested_data']);

0 commit comments

Comments
 (0)