/** * Returns the definition as string representation. * * @return string */ public function dump(ObjectDefinition $definition) { $className = $definition->getClassName(); $classExist = class_exists($className) || interface_exists($className); // Class if (!$classExist) { $warning = '#UNKNOWN# '; } else { $class = new \ReflectionClass($className); $warning = $class->isInstantiable() ? '' : '#NOT INSTANTIABLE# '; } $str = sprintf(' class = %s%s', $warning, $className); // Scope $str .= PHP_EOL . ' scope = ' . $definition->getScope(); // Lazy $str .= PHP_EOL . ' lazy = ' . var_export($definition->isLazy(), true); if ($classExist) { // Constructor $str .= $this->dumpConstructor($className, $definition); // Properties $str .= $this->dumpProperties($definition); // Methods $str .= $this->dumpMethods($className, $definition); } return sprintf('Object (' . PHP_EOL . '%s' . PHP_EOL . ')', $str); }
/** * Fixes parameters indexed by the parameter name -> reindex by position. * * This is necessary so that merging definitions between sources is possible. * * @param ObjectDefinition $definition * @param string $method * @param array $parameters * @return array */ private function fixParameters(ObjectDefinition $definition, $method, $parameters) { $fixedParameters = array(); foreach ($parameters as $index => $parameter) { // Parameter indexed by the parameter name, we reindex it with its position if (is_string($index)) { $callable = array($definition->getClassName(), $method); $reflectionParameter = new \ReflectionParameter($callable, $index); $index = $reflectionParameter->getPosition(); } $fixedParameters[$index] = $parameter; } return $fixedParameters; }
private function assertClassExists(ObjectDefinition $definition) { if (!class_exists($definition->getClassName()) && !interface_exists($definition->getClassName())) { throw DefinitionException::create($definition, sprintf("Entry %s cannot be resolved: class %s doesn't exist", $definition->getName(), $definition->getClassName())); } }
/** * Fixes parameters indexed by the parameter name -> reindex by position. * * This is necessary so that merging definitions between sources is possible. * * @param ObjectDefinition $definition * @param string $method * @param array $parameters * @throws DefinitionException * @return array */ private function fixParameters(ObjectDefinition $definition, $method, $parameters) { $fixedParameters = []; foreach ($parameters as $index => $parameter) { // Parameter indexed by the parameter name, we reindex it with its position if (is_string($index)) { $callable = [$definition->getClassName(), $method]; try { $reflectionParameter = new \ReflectionParameter($callable, $index); } catch (\ReflectionException $e) { throw DefinitionException::create($definition, sprintf("Parameter with name '%s' could not be found. %s.", $index, $e->getMessage())); } $index = $reflectionParameter->getPosition(); } $fixedParameters[$index] = $parameter; } return $fixedParameters; }
/** * Returns a proxy instance. * * @param ObjectDefinition $definition * @param array $parameters * * @return LazyLoadingInterface Proxy instance */ private function createProxy(ObjectDefinition $definition, array $parameters) { /** @noinspection PhpUnusedParameterInspection */ $proxy = $this->proxyFactory->createProxy($definition->getClassName(), function (&$wrappedObject, $proxy, $method, $params, &$initializer) use($definition, $parameters) { $wrappedObject = $this->createInstance($definition, $parameters); $initializer = null; // turning off further lazy initialization return true; }); return $proxy; }