public function testGetSingleForClassAddedTwice() { $this->classMultiMap->put(self::SOME_CLASS_NAME, "someValue"); $this->classMultiMap->put(self::SOME_CLASS_NAME, "someOtherValue"); $this->setExpectedException("Skrz\\Bundle\\AutowiringBundle\\Exception\\MultipleValuesException"); $this->classMultiMap->getSingle(self::SOME_CLASS_NAME); }
/** * @param ReflectionClass $reflectionClass * @param string $docComment * @param string $parameterName * @param ReflectionClass $parameterReflectionClass * @param mixed $defaultValueAvailable * @param mixed $defaultValue * @param $preferredServices * @return mixed */ private function getValue(ReflectionClass $reflectionClass, $docComment, $parameterName, ReflectionClass $parameterReflectionClass = null, $defaultValueAvailable, $defaultValue, $preferredServices) { $className = null; $isArray = false; // resolve class name, whether value is array if ($parameterName !== null) { // parse parameter class if ($parameterReflectionClass) { $className = $parameterReflectionClass->getName(); } elseif (preg_match("/@param\\s+([a-zA-Z0-9\\\\_]+)(\\[\\])?(\\|[^\\s]+)*\\s+\\\$" . preg_quote($parameterName) . "/", $docComment, $m)) { $className = $m[1]; $isArray = isset($m[2]) && $m[2] === "[]"; } elseif (!$defaultValueAvailable) { throw new AutowiringException("Could not parse parameter type - neither type hint, nor @param annotation available."); } } else { // parse property class if (preg_match("/@var\\s+([a-zA-Z0-9\\\\_]+)(\\[\\])?/", $docComment, $m)) { $className = $m[1]; $isArray = isset($m[2]) && $m[2] === "[]"; } elseif (!$defaultValueAvailable) { throw new AutowiringException("Could not parse property type - no @var annotation."); } } // resolve class name to FQN $lowerClassName = trim(strtolower($className), "\\ \t\n"); $useStatements = $this->getUseStatements($reflectionClass); if (isset($useStatements[$lowerClassName])) { $className = $useStatements[$lowerClassName]; } elseif (strpos($className, "\\") === false) { $className = $reflectionClass->getNamespaceName() . "\\" . $className; } $className = trim($className, "\\"); // autowire from class map if ($isArray) { return array_map(function ($serviceId) { return new Reference($serviceId); }, $this->classMap->getMulti($className)); } elseif ($className !== null) { try { return new Reference($this->classMap->getSingle($className)); } catch (NoValueException $exception) { if ($defaultValueAvailable) { return $defaultValue; } else { throw new AutowiringException(sprintf("Missing service of type '%s'.", $className)); } } catch (MultipleValuesException $exception) { if (isset($preferredServices[$className])) { return new Reference($preferredServices[$className]); } else { throw new AutowiringException(sprintf("Multiple services of type '%s'.", $className)); } } } elseif ($defaultValueAvailable) { return $defaultValue; } else { throw new AutowiringException("Could not autowire."); } }