AutorÃa | Ultima modificación | Ver Log |
<?php declare(strict_types=1);namespace Invoker\ParameterResolver\Container;use Invoker\ParameterResolver\ParameterResolver;use Psr\Container\ContainerInterface;use ReflectionFunctionAbstract;use ReflectionNamedType;/*** Inject entries from a DI container using the type-hints.*/class TypeHintContainerResolver implements ParameterResolver{/** @var ContainerInterface */private $container;/*** @param ContainerInterface $container The container to get entries from.*/public function __construct(ContainerInterface $container){$this->container = $container;}public function getParameters(ReflectionFunctionAbstract $reflection,array $providedParameters,array $resolvedParameters): array {$parameters = $reflection->getParameters();// Skip parameters already resolvedif (! empty($resolvedParameters)) {$parameters = array_diff_key($parameters, $resolvedParameters);}foreach ($parameters as $index => $parameter) {$parameterType = $parameter->getType();if (! $parameterType) {// No typecontinue;}if (! $parameterType instanceof ReflectionNamedType) {// Union types are not supportedcontinue;}if ($parameterType->isBuiltin()) {// Primitive types are not supportedcontinue;}$parameterClass = $parameterType->getName();if ($parameterClass === 'self') {$parameterClass = $parameter->getDeclaringClass()->getName();}if ($this->container->has($parameterClass)) {$resolvedParameters[$index] = $this->container->get($parameterClass);}}return $resolvedParameters;}}