diff --git a/config/module.config.php b/config/module.config.php index 2af0011..c5b44c4 100644 --- a/config/module.config.php +++ b/config/module.config.php @@ -21,13 +21,13 @@ 'factories' => [ /* Factories that do not map to a class */ 'ZfrRest\Cache' => 'ZfrRest\Factory\CacheFactory', - 'ZfrRest\Resource\Metadata\ResourceMetadataFactory' => 'ZfrRest\Factory\ResourceMetadataFactoryFactory', 'ZfrRest\View\Renderer\ResourceRenderer' => 'ZfrRest\Factory\SimpleResourceRendererFactory', /* Factories that map to a class */ 'ZfrRest\Mvc\HttpExceptionListener' => 'ZfrRest\Factory\HttpExceptionListenerFactory', 'ZfrRest\Mvc\Controller\MethodHandler\MethodHandlerPluginManager' => 'ZfrRest\Factory\MethodHandlerPluginManagerFactory', 'ZfrRest\Options\ModuleOptions' => 'ZfrRest\Factory\ModuleOptionsFactory', + 'ZfrRest\Resource\Metadata\ResourceMetadataFactory' => 'ZfrRest\Factory\ResourceMetadataFactoryFactory', 'ZfrRest\Router\Http\Matcher\AssociationSubPathMatcher' => 'ZfrRest\Factory\AssociationSubPathMatcherFactory', 'ZfrRest\Router\Http\Matcher\BaseSubPathMatcher' => 'ZfrRest\Factory\BaseSubPathMatcherFactory', 'ZfrRest\View\Strategy\ResourceStrategy' => 'ZfrRest\Factory\ResourceStrategyFactory' diff --git a/src/ZfrRest/Factory/ResourceMetadataFactoryFactory.php b/src/ZfrRest/Factory/ResourceMetadataFactoryFactory.php index 39450c9..aad98df 100644 --- a/src/ZfrRest/Factory/ResourceMetadataFactoryFactory.php +++ b/src/ZfrRest/Factory/ResourceMetadataFactoryFactory.php @@ -20,11 +20,11 @@ use Doctrine\Common\Annotations\AnnotationReader; use Metadata\Driver\DriverChain; -use Metadata\MetadataFactory; use Zend\ServiceManager\FactoryInterface; use Zend\ServiceManager\ServiceLocatorInterface; use ZfrRest\Exception\RuntimeException; use ZfrRest\Resource\Metadata\Driver\AnnotationDriver; +use ZfrRest\Resource\Metadata\ResourceMetadataFactory; /** * @author Michaël Gallego @@ -47,7 +47,7 @@ public function createService(ServiceLocatorInterface $serviceLocator) $doctrineMetadataFactory = $objectManager->getMetadataFactory(); $driverChain = new DriverChain(); - $resourceMetadataFactory = new MetadataFactory($driverChain); + $resourceMetadataFactory = new ResourceMetadataFactory($doctrineMetadataFactory, $driverChain); $drivers = $moduleOptions->getDrivers(); foreach ($drivers as $driverOptions) { @@ -55,10 +55,8 @@ public function createService(ServiceLocatorInterface $serviceLocator) switch($driverOptions->getClass()) { case 'ZfrRest\Resource\Metadata\Driver\AnnotationDriver': - $driver = new AnnotationDriver( - new AnnotationReader(), - $doctrineMetadataFactory - ); + $driver = new AnnotationDriver(new AnnotationReader()); + break; default: throw new RuntimeException(sprintf( diff --git a/src/ZfrRest/Resource/Metadata/Driver/AnnotationDriver.php b/src/ZfrRest/Resource/Metadata/Driver/AnnotationDriver.php index 9ad0caa..b74efd1 100644 --- a/src/ZfrRest/Resource/Metadata/Driver/AnnotationDriver.php +++ b/src/ZfrRest/Resource/Metadata/Driver/AnnotationDriver.php @@ -39,23 +39,14 @@ class AnnotationDriver implements DriverInterface */ protected $annotationReader; - /** - * @var ClassMetadataFactory - */ - protected $classMetadataFactory; - /** * Constructor * - * @param Reader $annotationReader - * @param ClassMetadataFactory $classMetadataFactory + * @param Reader $annotationReader */ - public function __construct( - Reader $annotationReader, - ClassMetadataFactory $classMetadataFactory - ) { - $this->annotationReader = $annotationReader; - $this->classMetadataFactory = $classMetadataFactory; + public function __construct(Reader $annotationReader) + { + $this->annotationReader = $annotationReader; } /** @@ -64,12 +55,8 @@ public function __construct( public function loadMetadataForClass(ReflectionClass $class) { $className = $class->getName(); - - $classMetadata = $this->classMetadataFactory->getMetadataFor($className); $resourceMetadata = new ResourceMetadata($className); - $resourceMetadata->propertyMetadata['classMetadata'] = $classMetadata; - // Process class level annotations $classAnnotations = $this->annotationReader->getClassAnnotations($class); $this->processMetadata($resourceMetadata, $classAnnotations); diff --git a/src/ZfrRest/Resource/Metadata/ResourceMetadata.php b/src/ZfrRest/Resource/Metadata/ResourceMetadata.php index 188f107..0c5b7c7 100755 --- a/src/ZfrRest/Resource/Metadata/ResourceMetadata.php +++ b/src/ZfrRest/Resource/Metadata/ResourceMetadata.php @@ -18,6 +18,8 @@ namespace ZfrRest\Resource\Metadata; +use Doctrine\Common\Persistence\Mapping\RuntimeReflectionService; +use Doctrine\ORM\Mapping\ClassMetadataInfo; use Metadata\ClassMetadata; use ZfrRest\Resource\Exception; use ZfrRest\Resource\Resource; @@ -109,4 +111,16 @@ public function getAssociationMetadata($association) return $this->propertyMetadata['associations'][$association]; } + + /** + * We don't want to serialize ourself the Doctrine class metadata, because it needs + * special handing that is performed by the class metadata factory + * + * @return string + */ + public function serialize() + { + unset($this->propertyMetadata['classMetadata']); + return parent::serialize(); + } } diff --git a/src/ZfrRest/Resource/Metadata/ResourceMetadataFactory.php b/src/ZfrRest/Resource/Metadata/ResourceMetadataFactory.php new file mode 100644 index 0000000..50de77e --- /dev/null +++ b/src/ZfrRest/Resource/Metadata/ResourceMetadataFactory.php @@ -0,0 +1,57 @@ + + * @licence MIT + */ +class ResourceMetadataFactory extends MetadataFactory +{ + /** + * @var ClassMetadataFactory + */ + protected $classMetadataFactory; + + /** + * @param ClassMetadataFactory $classMetadataFactory + * @param DriverInterface $driver + */ + public function __construct(ClassMetadataFactory $classMetadataFactory, DriverInterface $driver) + { + $this->classMetadataFactory = $classMetadataFactory; + parent::__construct($driver); + } + + /** + * @param string $className + * @return ResourceMetadataInterface + */ + public function getMetadataForClass($className) + { + $resourceMetadata = parent::getMetadataForClass($className); + $resourceMetadata->propertyMetadata['classMetadata'] = $this->classMetadataFactory->getMetadataFor($className); + + return $resourceMetadata; + } +} diff --git a/tests/ZfrRestTest/Factory/ResourceMetadataFactoryFactoryTest.php b/tests/ZfrRestTest/Factory/ResourceMetadataFactoryFactoryTest.php index d990ad1..eddc3ad 100755 --- a/tests/ZfrRestTest/Factory/ResourceMetadataFactoryFactoryTest.php +++ b/tests/ZfrRestTest/Factory/ResourceMetadataFactoryFactoryTest.php @@ -79,6 +79,6 @@ public function testCreateFromFactory($driverConfig, $throwException) $factory = new ResourceMetadataFactoryFactory(); $result = $factory->createService($serviceManager); - $this->assertInstanceOf('Metadata\MetadataFactory', $result); + $this->assertInstanceOf('ZfrRest\Resource\Metadata\ResourceMetadataFactory', $result); } } diff --git a/tests/ZfrRestTest/Resource/Metadata/ResourceMetadataFactoryTest.php b/tests/ZfrRestTest/Resource/Metadata/ResourceMetadataFactoryTest.php new file mode 100644 index 0000000..ede1c67 --- /dev/null +++ b/tests/ZfrRestTest/Resource/Metadata/ResourceMetadataFactoryTest.php @@ -0,0 +1,49 @@ + + * + * @group Coverage + * @covers \ZfrRest\Resource\Metadata\ResourceMetadataFactory + */ +class ResourceMetadataFactoryTest extends \PHPUnit_Framework_TestCase +{ + public function testAssertDoctrineClassMetadataIsFilled() + { + $classMetadataFactory = $this->getMock('Doctrine\Common\Persistence\Mapping\ClassMetadataFactory'); + $driver = $this->getMock('Metadata\Driver\DriverInterface'); + + $metadataFactory = new ResourceMetadataFactory($classMetadataFactory, $driver); + + $classMetadata = $this->getMock('Doctrine\Common\Persistence\Mapping\ClassMetadata'); + + $classMetadataFactory->expects($this->once()) + ->method('getMetadataFor') + ->will($this->returnValue($classMetadata)); + + $resourceMetadata = $metadataFactory->getMetadataForClass('stdClass'); + + $this->assertSame($classMetadata, $resourceMetadata->propertyMetadata['classMetadata']); + } +}