Skip to content

Commit 34f7eaf

Browse files
Allow use factories and OM for creating objects with variadic arguments in constructor
1 parent 32305e0 commit 34f7eaf

File tree

2 files changed

+22
-4
lines changed

2 files changed

+22
-4
lines changed

lib/internal/Magento/Framework/Code/Reader/ClassReader.php

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,8 @@ public function getConstructor($className)
2828
$parameter->getName(),
2929
$parameter->getClass() !== null ? $parameter->getClass()->getName() : null,
3030
!$parameter->isOptional() && !$parameter->isDefaultValueAvailable(),
31-
$parameter->isDefaultValueAvailable() ? $parameter->getDefaultValue() : null,
31+
$this->getReflectionParameterDefaultValue($parameter),
32+
$parameter->isVariadic(),
3233
];
3334
} catch (\ReflectionException $e) {
3435
$message = $e->getMessage();
@@ -40,6 +41,19 @@ public function getConstructor($className)
4041
return $result;
4142
}
4243

44+
/**
45+
* @param \ReflectionParameter $parameter
46+
* @return array|mixed|null
47+
*/
48+
private function getReflectionParameterDefaultValue(\ReflectionParameter $parameter)
49+
{
50+
if ($parameter->isVariadic()) {
51+
return [];
52+
}
53+
54+
return $parameter->isDefaultValueAvailable() ? $parameter->getDefaultValue() : null;
55+
}
56+
4357
/**
4458
* Retrieve parent relation information for type in a following format
4559
* array(

lib/internal/Magento/Framework/ObjectManager/Factory/AbstractFactory.php

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -226,7 +226,7 @@ protected function resolveArgumentsInRuntime($requestedType, array $parameters,
226226
{
227227
$resolvedArguments = [];
228228
foreach ($parameters as $parameter) {
229-
list($paramName, $paramType, $paramRequired, $paramDefault) = $parameter;
229+
list($paramName, $paramType, $paramRequired, $paramDefault, $isVariadic) = $parameter;
230230
$argument = null;
231231
if (!empty($arguments) && (isset($arguments[$paramName]) || array_key_exists($paramName, $arguments))) {
232232
$argument = $arguments[$paramName];
@@ -243,9 +243,13 @@ protected function resolveArgumentsInRuntime($requestedType, array $parameters,
243243
$argument = $paramDefault;
244244
}
245245

246-
$this->resolveArgument($argument, $paramType, $paramDefault, $paramName, $requestedType);
246+
if ($isVariadic && is_array($argument)) {
247+
$resolvedArguments = array_merge($resolvedArguments, $argument);
248+
} else {
249+
$this->resolveArgument($argument, $paramType, $paramDefault, $paramName, $requestedType);
250+
$resolvedArguments[] = $argument;
251+
}
247252

248-
$resolvedArguments[] = $argument;
249253
}
250254
return $resolvedArguments;
251255
}

0 commit comments

Comments
 (0)