Procházet zdrojové kódy

moves driver creation to dedicated class (closes #247)

Johannes Schmitt před 11 roky
rodič
revize
d8b4c0fbe4

+ 29 - 0
src/JMS/Serializer/Builder/CallbackDriverFactory.php

@@ -0,0 +1,29 @@
+<?php
+
+namespace JMS\Serializer\Builder;
+
+use Doctrine\Common\Annotations\Reader;
+use Metadata\Driver\DriverInterface;
+
+class CallbackDriverFactory implements DriverFactoryInterface
+{
+    private $callback;
+
+    /**
+     * @param callable $callable
+     */
+    public function __construct($callable)
+    {
+        $this->callback = $callable;
+    }
+
+    public function createDriver(array $metadataDirs, Reader $reader)
+    {
+        $driver = call_user_func($this->callback, $metadataDirs, $reader);
+        if ( ! $driver instanceof DriverInterface) {
+            throw new \LogicException('The callback must return an instance of DriverInterface.');
+        }
+
+        return $driver;
+    }
+}

+ 28 - 0
src/JMS/Serializer/Builder/DefaultDriverFactory.php

@@ -0,0 +1,28 @@
+<?php
+
+namespace JMS\Serializer\Builder;
+
+use Doctrine\Common\Annotations\Reader;
+use JMS\Serializer\Metadata\Driver\AnnotationDriver;
+use JMS\Serializer\Metadata\Driver\XmlDriver;
+use JMS\Serializer\Metadata\Driver\YamlDriver;
+use Metadata\Driver\DriverChain;
+use Metadata\Driver\FileLocator;
+
+class DefaultDriverFactory implements DriverFactoryInterface
+{
+    public function createDriver(array $metadataDirs, Reader $annotationReader)
+    {
+        if ( ! empty($this->metadataDirs)) {
+            $fileLocator = new FileLocator($this->metadataDirs);
+
+            return new DriverChain(array(
+                new YamlDriver($fileLocator),
+                new XmlDriver($fileLocator),
+                new AnnotationDriver($annotationReader),
+            ));
+        }
+
+        return new AnnotationDriver($annotationReader);
+    }
+}

+ 17 - 0
src/JMS/Serializer/Builder/DriverFactoryInterface.php

@@ -0,0 +1,17 @@
+<?php
+
+namespace JMS\Serializer\Builder;
+
+use Doctrine\Common\Annotations\Reader;
+use Metadata\Driver\DriverInterface;
+
+interface DriverFactoryInterface
+{
+    /**
+     * @param array $metadataDirs
+     * @param Reader $annotationReader
+     *
+     * @return DriverInterface
+     */
+    public function createDriver(array $metadataDirs, Reader $annotationReader);
+}

+ 11 - 11
src/JMS/Serializer/SerializerBuilder.php

@@ -18,9 +18,12 @@
 
 
 namespace JMS\Serializer;
 namespace JMS\Serializer;
 
 
+use JMS\Serializer\Builder\DefaultDriverFactory;
+use JMS\Serializer\Builder\DriverFactoryInterface;
 use JMS\Serializer\Handler\PhpCollectionHandler;
 use JMS\Serializer\Handler\PhpCollectionHandler;
 use JMS\Serializer\Handler\PropelCollectionHandler;
 use JMS\Serializer\Handler\PropelCollectionHandler;
 use JMS\Serializer\Exception\RuntimeException;
 use JMS\Serializer\Exception\RuntimeException;
+use Metadata\Driver\DriverInterface;
 use Metadata\MetadataFactory;
 use Metadata\MetadataFactory;
 use JMS\Serializer\Metadata\Driver\AnnotationDriver;
 use JMS\Serializer\Metadata\Driver\AnnotationDriver;
 use JMS\Serializer\Handler\HandlerRegistry;
 use JMS\Serializer\Handler\HandlerRegistry;
@@ -68,6 +71,7 @@ class SerializerBuilder
     private $cacheDir;
     private $cacheDir;
     private $annotationReader;
     private $annotationReader;
     private $includeInterfaceMetadata = false;
     private $includeInterfaceMetadata = false;
+    private $driverFactory;
 
 
     public static function create()
     public static function create()
     {
     {
@@ -78,6 +82,7 @@ class SerializerBuilder
     {
     {
         $this->handlerRegistry = new HandlerRegistry();
         $this->handlerRegistry = new HandlerRegistry();
         $this->eventDispatcher = new EventDispatcher();
         $this->eventDispatcher = new EventDispatcher();
+        $this->driverFactory = new DefaultDriverFactory();
         $this->serializationVisitors = new Map();
         $this->serializationVisitors = new Map();
         $this->deserializationVisitors = new Map();
         $this->deserializationVisitors = new Map();
     }
     }
@@ -321,6 +326,11 @@ class SerializerBuilder
         return $this;
         return $this;
     }
     }
 
 
+    public function setMetadataDriverFactory(DriverFactoryInterface $driverFactory)
+    {
+        $this->driverFactory = $driverFactory;
+    }
+
     public function build()
     public function build()
     {
     {
         $annotationReader = $this->annotationReader;
         $annotationReader = $this->annotationReader;
@@ -333,17 +343,7 @@ class SerializerBuilder
             }
             }
         }
         }
 
 
-        if ( ! empty($this->metadataDirs)) {
-            $fileLocator = new FileLocator($this->metadataDirs);
-            $metadataDriver = new DriverChain(array(
-                new YamlDriver($fileLocator),
-                new XmlDriver($fileLocator),
-                new AnnotationDriver($annotationReader),
-            ));
-        } else {
-            $metadataDriver = new AnnotationDriver($annotationReader);
-        }
-
+        $metadataDriver = $this->driverFactory->createDriver($this->metadataDirs, $annotationReader);
         $metadataFactory = new MetadataFactory($metadataDriver, null, $this->debug);
         $metadataFactory = new MetadataFactory($metadataDriver, null, $this->debug);
 
 
         $metadataFactory->setIncludeInterfaces($this->includeInterfaceMetadata);
         $metadataFactory->setIncludeInterfaces($this->includeInterfaceMetadata);