3 namespace League\Container\Argument;
5 use League\Container\Exception\NotFoundException;
6 use League\Container\ReflectionContainer;
7 use ReflectionFunctionAbstract;
8 use ReflectionParameter;
10 trait ArgumentResolverTrait
15 public function resolveArguments(array $arguments)
17 foreach ($arguments as &$arg) {
18 if ($arg instanceof RawArgumentInterface) {
19 $arg = $arg->getValue();
23 if (! is_string($arg)) {
27 $container = $this->getContainer();
29 if (is_null($container) && $this instanceof ReflectionContainer) {
33 if (! is_null($container) && $container->has($arg)) {
34 $arg = $container->get($arg);
36 if ($arg instanceof RawArgumentInterface) {
37 $arg = $arg->getValue();
50 public function reflectArguments(ReflectionFunctionAbstract $method, array $args = [])
52 $arguments = array_map(function (ReflectionParameter $param) use ($method, $args) {
53 $name = $param->getName();
54 $class = $param->getClass();
56 if (array_key_exists($name, $args)) {
60 if (! is_null($class)) {
61 return $class->getName();
64 if ($param->isDefaultValueAvailable()) {
65 return $param->getDefaultValue();
68 throw new NotFoundException(sprintf(
69 'Unable to resolve a value for parameter (%s) in the function/method (%s)',
73 }, $method->getParameters());
75 return $this->resolveArguments($arguments);
79 * @return \League\Container\ContainerInterface
81 abstract public function getContainer();