/** * Retrieves the generated hydrator FQCN * * @return string */ public function getHydratorClass() { $inflector = $this->configuration->getClassNameInflector(); $realClassName = $inflector->getUserClassName($this->configuration->getHydratedClassName()); $hydratorClassName = $inflector->getGeneratedClassName($realClassName, array('factory' => get_class($this))); if (!class_exists($hydratorClassName) && $this->configuration->doesAutoGenerateProxies()) { $generator = new HydratorGenerator(); $originalClass = new ReflectionClass($realClassName); $generatedAst = $generator->generate($originalClass); $traverser = new NodeTraverser(); $traverser->addVisitor(new ClassRenamerVisitor($originalClass, $hydratorClassName)); $this->configuration->getGeneratorStrategy()->generate($traverser->traverse($generatedAst)); $this->configuration->getGeneratedClassAutoloader()->__invoke($hydratorClassName); } return $hydratorClassName; }
/** * @dataProvider getTestedImplementations * * Verifies that generated code is valid and implements expected interfaces */ public function testGeneratesValidCode($className) { $generator = new HydratorGenerator(); $generatedClassName = UniqueIdentifierGenerator::getIdentifier('HydratorGeneratorTest'); $originalClass = new ReflectionClass($className); $generatorStrategy = new EvaluatingGeneratorStrategy(); $traverser = new NodeTraverser(); $traverser->addVisitor(new ClassRenamerVisitor($originalClass, $generatedClassName)); $generatorStrategy->generate($traverser->traverse($generator->generate($originalClass))); $generatedReflection = new ReflectionClass($generatedClassName); if ($originalClass->isInterface()) { $this->assertTrue($generatedReflection->implementsInterface($className)); } else { $this->assertInstanceOf('ReflectionClass', $generatedReflection->getParentClass()); $this->assertSame($originalClass->getName(), $generatedReflection->getParentClass()->getName()); } $this->assertSame($generatedClassName, $generatedReflection->getName()); foreach ($this->getExpectedImplementedInterfaces() as $interface) { $this->assertTrue($generatedReflection->implementsInterface($interface)); } }