/** * Builds a new instance of $objectType with the given $possibleConstructorArgumentValues. If * constructor argument values are missing from the given array the method * looks for a default value in the constructor signature. Furthermore, the constructor arguments are removed from $possibleConstructorArgumentValues * * @param array &$possibleConstructorArgumentValues * @param string $objectType * @return object The created instance * @throws \TYPO3\CMS\Extbase\Property\Exception\InvalidTargetException if a required constructor argument is missing */ protected function buildObject(array &$possibleConstructorArgumentValues, $objectType) { $specificObjectType = $this->objectContainer->getImplementationClassName($objectType); if ($this->reflectionService->hasMethod($specificObjectType, '__construct')) { $constructorSignature = $this->reflectionService->getMethodParameters($specificObjectType, '__construct'); $constructorArguments = array(); foreach ($constructorSignature as $constructorArgumentName => $constructorArgumentInformation) { if (array_key_exists($constructorArgumentName, $possibleConstructorArgumentValues)) { $constructorArguments[] = $possibleConstructorArgumentValues[$constructorArgumentName]; unset($possibleConstructorArgumentValues[$constructorArgumentName]); } elseif ($constructorArgumentInformation['optional'] === TRUE) { $constructorArguments[] = $constructorArgumentInformation['defaultValue']; } else { throw new \TYPO3\CMS\Extbase\Property\Exception\InvalidTargetException('Missing constructor argument "' . $constructorArgumentName . '" for object of type "' . $objectType . '".', 1268734872); } } return call_user_func_array(array($this->objectManager, 'get'), array_merge(array($objectType), $constructorArguments)); } else { return $this->objectManager->get($objectType); } }