5 * @link http://php-di.org/
6 * @copyright Matthieu Napoli (http://mnapoli.fr/)
7 * @license http://www.opensource.org/licenses/mit-license.php MIT (see the LICENSE file)
10 namespace DI\Definition\Dumper;
12 use DI\Definition\ObjectDefinition;
13 use DI\Definition\ObjectDefinition\MethodInjection;
14 use DI\Definition\Definition;
15 use DI\Definition\EntryReference;
16 use ReflectionException;
20 * Dumps object definitions.
23 * @author Matthieu Napoli <matthieu@mnapoli.fr>
25 class ObjectDefinitionDumper implements DefinitionDumper
30 public function dump(Definition $definition)
32 if (! $definition instanceof ObjectDefinition) {
33 throw new \InvalidArgumentException(sprintf(
34 'This definition dumper is only compatible with ObjectDefinition objects, %s given',
35 get_class($definition)
39 $className = $definition->getClassName();
40 $classExist = class_exists($className) || interface_exists($className);
44 $warning = '#UNKNOWN# ';
46 $class = new \ReflectionClass($className);
47 $warning = $class->isInstantiable() ? '' : '#NOT INSTANTIABLE# ';
49 $str = sprintf(' class = %s%s', $warning, $className);
52 $str .= PHP_EOL . " scope = " . $definition->getScope();
55 $str .= PHP_EOL . " lazy = " . var_export($definition->isLazy(), true);
59 $str .= $this->dumpConstructor($className, $definition);
62 $str .= $this->dumpProperties($definition);
65 $str .= $this->dumpMethods($className, $definition);
68 return sprintf("Object (" . PHP_EOL . "%s" . PHP_EOL . ")", $str);
71 private function dumpConstructor($className, ObjectDefinition $definition)
75 $constructorInjection = $definition->getConstructorInjection();
77 if ($constructorInjection !== null) {
78 $parameters = $this->dumpMethodParameters($className, $constructorInjection);
80 $str .= sprintf(PHP_EOL . " __construct(" . PHP_EOL . " %s" . PHP_EOL . " )", $parameters);
86 private function dumpProperties(ObjectDefinition $definition)
90 foreach ($definition->getPropertyInjections() as $propertyInjection) {
91 $value = $propertyInjection->getValue();
92 if ($value instanceof EntryReference) {
93 $valueStr = sprintf('get(%s)', $value->getName());
95 $valueStr = var_export($value, true);
98 $str .= sprintf(PHP_EOL . " $%s = %s", $propertyInjection->getPropertyName(), $valueStr);
104 private function dumpMethods($className, ObjectDefinition $definition)
108 foreach ($definition->getMethodInjections() as $methodInjection) {
109 $parameters = $this->dumpMethodParameters($className, $methodInjection);
111 $str .= sprintf(PHP_EOL . " %s(" . PHP_EOL . " %s" . PHP_EOL . " )", $methodInjection->getMethodName(), $parameters);
117 private function dumpMethodParameters($className, MethodInjection $methodInjection)
119 $methodReflection = new \ReflectionMethod($className, $methodInjection->getMethodName());
123 $definitionParameters = $methodInjection->getParameters();
125 foreach ($methodReflection->getParameters() as $index => $parameter) {
126 if (array_key_exists($index, $definitionParameters)) {
127 $value = $definitionParameters[$index];
129 if ($value instanceof EntryReference) {
130 $args[] = sprintf('$%s = get(%s)', $parameter->getName(), $value->getName());
132 $args[] = sprintf('$%s = %s', $parameter->getName(), var_export($value, true));
137 // If the parameter is optional and wasn't specified, we take its default value
138 if ($parameter->isOptional()) {
140 $value = $parameter->getDefaultValue();
143 '$%s = (default value) %s',
144 $parameter->getName(),
145 var_export($value, true)
148 } catch (ReflectionException $e) {
149 // The default value can't be read through Reflection because it is a PHP internal class
153 $args[] = sprintf('$%s = #UNDEFINED#', $parameter->getName());
156 return implode(PHP_EOL . ' ', $args);