Ir a la última revisión | Autoría | Comparar con el anterior | Ultima modificación | Ver Log |
<?phpdeclare(strict_types=1);namespace DI\Definition\Source;use DI\Definition\ObjectDefinition;use DI\Definition\ObjectDefinition\MethodInjection;use DI\Definition\Reference;use ReflectionNamedType;/*** Reads DI class definitions using reflection.** @author Matthieu Napoli <matthieu@mnapoli.fr>*/class ReflectionBasedAutowiring implements DefinitionSource, Autowiring{public function autowire(string $name, ObjectDefinition $definition = null) : ObjectDefinition|null{$className = $definition ? $definition->getClassName() : $name;if (!class_exists($className) && !interface_exists($className)) {return $definition;}$definition = $definition ?: new ObjectDefinition($name);// Constructor$class = new \ReflectionClass($className);$constructor = $class->getConstructor();if ($constructor && $constructor->isPublic()) {$constructorInjection = MethodInjection::constructor($this->getParametersDefinition($constructor));$definition->completeConstructorInjection($constructorInjection);}return $definition;}public function getDefinition(string $name) : ObjectDefinition|null{return $this->autowire($name);}/*** Autowiring cannot guess all existing definitions.*/public function getDefinitions() : array{return [];}/*** Read the type-hinting from the parameters of the function.*/private function getParametersDefinition(\ReflectionFunctionAbstract $constructor) : array{$parameters = [];foreach ($constructor->getParameters() as $index => $parameter) {// Skip optional parametersif ($parameter->isOptional()) {continue;}$parameterType = $parameter->getType();if (!$parameterType) {// No typecontinue;}if (!$parameterType instanceof ReflectionNamedType) {// Union types are not supportedcontinue;}if ($parameterType->isBuiltin()) {// Primitive types are not supportedcontinue;}$parameters[$index] = new Reference($parameterType->getName());}return $parameters;}}