diff --git a/src/Container/Container.php b/src/Container/Container.php index a27dfee..c66fb47 100644 --- a/src/Container/Container.php +++ b/src/Container/Container.php @@ -8,6 +8,7 @@ use ReflectionFunction; use ReflectionMethod; use ReflectionParameter; +use Throwable; use function array_key_exists; use function array_map; use function class_exists; @@ -117,11 +118,14 @@ $definition = $this->definition($name); if ($definition === null) { throw new NotFoundException(sprintf("Cannot find definition for '%s'", $name)); - } - if (array_key_exists('value', $definition)) { + } elseif (array_key_exists('value', $definition)) { return $definition['value']; } - $result = ($definition['callback'])($this); + try { + $result = ($definition['callback'])($this); + } catch (Throwable $ex) { + throw new ContainerException(sprintf("Failed to create entity '%s'", $name), 0, $ex); + } if (isset($definition['singleton'])) { $this->definitions[$name]['value'] = $result; } @@ -162,7 +166,10 @@ if (array_key_exists($name, $this->definitions)) { return $this->definitions[$name]; } elseif (class_exists($name)) { - $this->definitions[$name] = ['callback' => $this->constructor($name), 'singleton' => false]; + $this->definitions[$name] = [ + 'callback' => $this->constructor($name), + 'singleton' => false + ]; return $this->definitions[$name]; } return null; @@ -254,7 +261,7 @@ $name = $parameter->getName(); if (array_key_exists($name, $constants)) { return [false, $constants[$name]]; - } elseif (($type = $parameter->getType()) && !$type->isBuiltin() && ($this->has($typename = $type->getName()) || class_exists($typename))) { + } elseif (($type = $parameter->getType()) && !$type->isBuiltin() && $this->has($typename = $type->getName())) { return [true, $typename]; } elseif ($parameter->isDefaultValueAvailable()) { return [false, $parameter->getDefaultValue()];