Bläddra i källkod

Initial entry of DoctrineMongoDBBundle

Jonathan H. Wage 15 år sedan
förälder
incheckning
be9148adf2

+ 179 - 0
src/Symfony/Framework/DoctrineMongoDBBundle/DependencyInjection/MongoDBExtension.php

@@ -0,0 +1,179 @@
+<?php
+
+namespace Symfony\Framework\DoctrineMongoDBBundle\DependencyInjection;
+
+use Symfony\Components\DependencyInjection\Loader\LoaderExtension;
+use Symfony\Components\DependencyInjection\Loader\XmlFileLoader;
+use Symfony\Components\DependencyInjection\BuilderConfiguration;
+use Symfony\Components\DependencyInjection\Reference;
+use Symfony\Components\DependencyInjection\Definition;
+use Symfony\Components\DependencyInjection\FileResource;
+
+/**
+ * Doctrine MongoDB ODM extension.
+ *
+ * @author Bulat Shakirzyanov <bulat@theopenskyproject.com>
+ * @author Kris Wallsmith <kris.wallsmith@symfony-project.com>
+ * @author Jonathan H. Wage <jonwage@gmail.com>
+ *
+ * @todo Add support for multiple document managers
+ */
+class MongoDBExtension extends LoaderExtension
+{
+    protected $bundles;
+    protected $resources = array(
+        'mongodb' => 'mongodb.xml',
+    );
+
+    public function __construct(array $bundles)
+    {
+        $this->bundles = $bundles;
+    }
+
+    public function mongodbLoad($config, BuilderConfiguration $configuration)
+    {
+        $loader = new XmlFileLoader(__DIR__.'/../Resources/config');
+        $configuration->merge($loader->load($this->resources['mongodb']));
+
+        if (!$configuration->hasDefinition('doctrine.odm.mongodb.document_manager')) {
+
+            $configuration->setParameter('doctrine.odm.mongodb.mapping_dirs', $this->findBundleSubpaths('Resources/config/doctrine/metadata', $configuration));
+            $configuration->setParameter('doctrine.odm.mongodb.document_dirs', $this->findBundleSubpaths('Document', $configuration));
+
+            $configuration->setDefinition('doctrine.odm.mongodb.metadata', $this->buildMetadataDefinition($configuration));
+        }
+
+        foreach (array('host', 'port', 'database') as $key) {
+            if (isset($config[$key])) {
+                $configuration->setParameter('doctrine.odm.mongodb.default_'.$key, $config[$key]);
+            }
+        }
+
+        foreach (array('proxy_dir', 'auto_generate_proxy_classes') as $key) {
+            if (isset($config[$key])) {
+                $configuration->setParameter('doctrine.odm.mongodb.'.$key, $config[$key]);
+            }
+        }
+
+        foreach (array('cache', 'metadata') as $key) {
+            if (isset($config[$key])) {
+                $configuration->setAlias('doctrine.odm.mongodb.'.$key, 'doctrine.odm.mongodb.'.$key.'.'.$config[$key]);
+            }
+        }
+
+        return $configuration;
+    }
+
+    /**
+     * Finds existing bundle subpaths.
+     *
+     * @param string $path A subpath to check for
+     * @param Symfony\Components\DependencyInjection\BuilderConfiguration $configuration A builder configuration
+     *
+     * @return array An array of absolute directory paths
+     */
+    protected function findBundleSubpaths($path, BuilderConfiguration $configuration)
+    {
+        $dirs = array();
+        foreach ($this->bundles as $bundle) {
+            $reflection = new \ReflectionClass($bundle);
+            if (is_dir($dir = dirname($reflection->getFilename()).'/'.$path)) {
+                $dirs[] = $dir;
+                $configuration->addResource(new FileResource($dir));
+            } else {
+                // add the closest existing parent directory as a file resource
+                do {
+                    $dir = dirname($dir);
+                } while (!is_dir($dir));
+                $configuration->addResource(new FileResource($dir));
+            }
+        }
+
+        return $dirs;
+    }
+
+    /**
+     * Detects and builds the appropriate metadata driver for each bundle.
+     *
+     * @param Symfony\Components\DependencyInjection\BuilderConfiguration $configuration A builder configuration
+     *
+     * @return Symfony\Components\DependencyInjection\Definition A definition for the metadata service
+     */
+    protected function buildMetadataDefinition(BuilderConfiguration $configuration)
+    {
+        $definition = new Definition('%doctrine.odm.mongodb.metadata.chain_class%');
+
+        foreach ($this->bundles as $bundle) {
+            $reflection = new \ReflectionClass($bundle);
+            if ($driver = static::detectMetadataDriver(dirname($reflection->getFilename()), $configuration)) {
+                $definition->addMethodCall('addDriver', array(
+                    new Reference('doctrine.odm.mongodb.metadata.'.$driver),
+                    $reflection->getNamespaceName().'\\Document',
+                ));
+            }
+        }
+
+        return $definition;
+    }
+
+    /**
+     * Detects what metadata driver to use for the supplied directory.
+     *
+     * @param string $dir A directory path
+     * @param Symfony\Components\DependencyInjection\BuilderConfiguration $configuration A builder configuration
+     *
+     * @return string|null A metadata driver short name, if one can be detected
+     */
+    static protected function detectMetadataDriver($dir, BuilderConfiguration $configuration)
+    {
+        // add the closest existing directory as a resource
+        $resource = $dir.'/Resources/config/doctrine/metadata';
+        while (!is_dir($resource)) {
+            $resource = dirname($resource);
+        }
+        $configuration->addResource(new FileResource($resource));
+
+        if (count(glob($dir.'/Resources/config/doctrine/metadata/*.xml'))) {
+            return 'xml';
+        } elseif (count(glob($dir.'/Resources/config/doctrine/metadata/*.yml'))) {
+            return 'yml';
+        }
+
+        // add the directory itself as a resource
+        $configuration->addResource(new FileResource($dir));
+
+        if (is_dir($dir.'/Document')) {
+            return 'annotation';
+        }
+    }
+
+    /**
+     * Returns the namespace to be used for this extension (XML namespace).
+     *
+     * @return string The XML namespace
+     */
+    public function getNamespace()
+    {
+        return 'http://www.symfony-project.org/schema/dic/doctrine/odm/mongodb';
+    }
+
+    /**
+     * @return string
+     */
+    public function getXsdValidationBasePath()
+    {
+        return __DIR__.'/../Resources/config';
+    }
+
+    /**
+     * Returns the recommended alias to use in XML.
+     *
+     * This alias is also the mandatory prefix to use when using YAML.
+     *
+     * @return string The alias
+     */
+    public function getAlias()
+    {
+        return 'doctrine_odm';
+    }
+}

+ 23 - 0
src/Symfony/Framework/DoctrineMongoDBBundle/DoctrineMongoDBBundle.php

@@ -0,0 +1,23 @@
+<?php
+
+namespace Symfony\Framework\DoctrineMongoDBBundle;
+
+use Symfony\Foundation\Bundle\Bundle;
+use Symfony\Components\DependencyInjection\ContainerInterface;
+use Symfony\Components\DependencyInjection\Loader\Loader;
+use Symfony\Framework\DoctrineMongoDBBundle\DependencyInjection\MongoDBExtension;
+
+/**
+ * Doctrine MongoDB ODM bundle.
+ *
+ * @author Bulat Shakirzyanov <bulat@theopenskyproject.com>
+ * @author Kris Wallsmith <kris.wallsmith@symfony-project.com>
+ * @author Jonathan H. Wage <jonwage@gmail.com>
+ */
+class DoctrineMongoDBBundle extends Bundle 
+{
+    public function buildContainer(ContainerInterface $container) 
+    {
+        Loader::registerExtension(new MongoDBExtension($container->getParameter('kernel.bundles')));
+    }
+}

+ 101 - 0
src/Symfony/Framework/DoctrineMongoDBBundle/Resources/config/mongodb.xml

@@ -0,0 +1,101 @@
+<?xml version="1.0" ?>
+
+<container xmlns="http://www.symfony-project.org/schema/dic/services"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://www.symfony-project.org/schema/dic/services http://www.symfony-project.org/schema/dic/services/services-1.0.xsd">
+
+  <parameters>
+    <parameter key="doctrine.odm.mongodb.connection_class">Doctrine\ODM\MongoDB\Mongo</parameter>
+    <parameter key="doctrine.odm.mongodb.configuration_class">Doctrine\ODM\MongoDB\Configuration</parameter>
+    <parameter key="doctrine.odm.mongodb.document_manager_class">Doctrine\ODM\MongoDB\DocumentManager</parameter>
+
+    <!-- connection -->
+    <parameter key="doctrine.odm.mongodb.default_server">%doctrine.odm.mongodb.default_host%:%doctrine.odm.mongodb.default_port%</parameter>
+    <parameter key="doctrine.odm.mongodb.default_host">localhost</parameter>
+    <parameter key="doctrine.odm.mongodb.default_port">27017</parameter>
+    <parameter key="doctrine.odm.mongodb.default_database">%kernel.name%_%kernel.environment%</parameter>
+    <parameter key="doctrine.odm.mongodb.default_connection_options" type="collection"><parameter key="connect">true</parameter></parameter>
+
+    <!-- proxies -->
+    <parameter key="doctrine.odm.mongodb.proxy_dir">%kernel.cache_dir%/Proxies</parameter>
+    <parameter key="doctrine.odm.mongodb.proxy_namespace">Proxies</parameter>
+    <parameter key="doctrine.odm.mongodb.auto_generate_proxy_classes">false</parameter>
+
+    <!-- cache -->
+    <parameter key="doctrine.odm.mongodb.cache.array_class">Doctrine\Common\Cache\ArrayCache</parameter>
+    <parameter key="doctrine.odm.mongodb.cache.apc_class">Doctrine\Common\Cache\ApcCache</parameter>
+    <parameter key="doctrine.odm.mongodb.cache.memcache_class">Doctrine\Common\Cache\MemcacheCache</parameter>
+    <parameter key="doctrine.odm.mongodb.cache.memcache_host">localhost</parameter>
+    <parameter key="doctrine.odm.mongodb.cache.memcache_port">11211</parameter>
+    <parameter key="doctrine.odm.mongodb.cache.memcache_instance_class">Memcache</parameter>
+    <parameter key="doctrine.odm.mongodb.cache.xcache_class">Doctrine\Common\Cache\XcacheCache</parameter>
+
+    <!-- metadata -->
+    <parameter key="doctrine.odm.mongodb.metadata.chain_class">Doctrine\ODM\MongoDB\Mapping\Driver\DriverChain</parameter>
+    <parameter key="doctrine.odm.mongodb.metadata.annotation_class">Doctrine\ODM\MongoDB\Mapping\Driver\AnnotationDriver</parameter>
+    <parameter key="doctrine.odm.mongodb.metadata.annotation_reader_class">Doctrine\Common\Annotations\AnnotationReader</parameter>
+    <parameter key="doctrine.odm.mongodb.metadata.annotation_default_namespace">Doctrine\ODM\MongoDB\Mapping\</parameter>
+    <parameter key="doctrine.odm.mongodb.metadata.xml_class">Doctrine\ODM\MongoDB\Mapping\Driver\XmlDriver</parameter>
+    <parameter key="doctrine.odm.mongodb.metadata.yml_class">Doctrine\ODM\MongoDB\Mapping\Driver\YamlDriver</parameter>
+
+    <!-- directories -->
+    <parameter key="doctrine.odm.mongodb.mapping_dirs" type="collection"></parameter>
+    <parameter key="doctrine.odm.mongodb.xml_mapping_dirs">%doctrine.odm.mongodb.mapping_dirs%</parameter>
+    <parameter key="doctrine.odm.mongodb.yml_mapping_dirs">%doctrine.odm.mongodb.mapping_dirs%</parameter>
+    <parameter key="doctrine.odm.mongodb.document_dirs" type="collection"></parameter>
+  </parameters>
+
+  <services>
+    <!-- defaults -->
+    <service id="doctrine.odm.mongodb.metadata" alias="doctrine.odm.mongodb.metadata.annotation" />
+    <service id="doctrine.odm.mongodb.cache" alias="doctrine.odm.mongodb.cache.array" />
+
+    <!-- metadata -->
+    <service id="doctrine.odm.mongodb.metadata.chain" class="%doctrine.odm.mongodb.metadata.chain_class%" />
+    <service id="doctrine.odm.mongodb.metadata.annotation" class="%doctrine.odm.mongodb.metadata.annotation_class%">
+      <argument type="service" id="doctrine.odm.mongodb.metadata.annotation_reader" />
+      <argument>%doctrine.odm.mongodb.document_dirs%</argument>
+    </service>
+    <service id="doctrine.odm.mongodb.metadata.annotation_reader" class="%doctrine.odm.mongodb.metadata.annotation_reader_class%">
+      <argument type="service" id="doctrine.odm.mongodb.cache" />
+      <call method="setDefaultAnnotationNamespace"><argument>%doctrine.odm.mongodb.metadata.annotation_default_namespace%</argument></call>
+    </service>
+    <service id="doctrine.odm.mongodb.metadata.xml" class="%doctrine.odm.mongodb.metadata.xml_class%"><argument>%doctrine.odm.mongodb.xml_mapping_dirs%</argument></service>
+    <service id="doctrine.odm.mongodb.metadata.yml" class="%doctrine.odm.mongodb.metadata.yml_class%"><argument>%doctrine.odm.mongodb.yml_mapping_dirs%</argument></service>
+
+    <!-- cache -->
+    <service id="doctrine.odm.mongodb.cache.array" class="%doctrine.odm.mongodb.cache.array_class%" />
+    <service id="doctrine.odm.mongodb.cache.apc" class="%doctrine.odm.mongodb.cache.apc_class%" />
+    <service id="doctrine.odm.mongodb.cache.memcache" class="%doctrine.odm.mongodb.cache.memcache_class%">
+      <call method="setMemcache"><argument type="service" id="doctrine.odm.mongodb.cache.memcache_instance" /></call>
+    </service>
+    <service id="doctrine.odm.mongodb.cache.memcache_instance" class="%doctrine.odm.mongodb.cache.memcache_instance_class%">
+      <call method="connect">
+        <argument>%doctrine.odm.mongodb.cache.memcache_host%</argument>
+        <argument>%doctrine.odm.mongodb.cache.memcache_port%</argument>
+      </call>
+    </service>
+    <service id="doctrine.odm.mongodb.cache.xcache" class="%doctrine.odm.mongodb.cache.xcache_class%" />
+
+    <!-- connection -->
+    <service id="doctrine.odm.mongodb.connection" class="%doctrine.odm.mongodb.connection_class%">
+      <argument>%doctrine.odm.mongodb.default_server%</argument>
+      <argument>%doctrine.odm.mongodb.default_connection_options%</argument>
+    </service>
+
+    <!-- configuration -->
+    <service id="doctrine.odm.mongodb.configuration" class="%doctrine.odm.mongodb.configuration_class%">
+      <call method="setProxyDir"><argument>%doctrine.odm.mongodb.proxy_dir%</argument></call>
+      <call method="setProxyNamespace"><argument>%doctrine.odm.mongodb.proxy_namespace%</argument></call>
+      <call method="setAutoGenerateProxyClasses"><argument>%doctrine.odm.mongodb.auto_generate_proxy_classes%</argument></call>
+      <call method="setMetadataDriverImpl"><argument type="service" id="doctrine.odm.mongodb.metadata" /></call>
+      <call method="setDefaultDB"><argument>%doctrine.odm.mongodb.default_database%</argument></call>
+    </service>
+
+    <!-- document manager -->
+    <service id="doctrine.odm.mongodb.document_manager" class="%doctrine.odm.mongodb.document_manager_class%" constructor="create">
+      <argument type="service" id="doctrine.odm.mongodb.connection" />
+      <argument type="service" id="doctrine.odm.mongodb.configuration" />
+    </service>
+  </services>
+</container>

+ 36 - 0
src/Symfony/Framework/DoctrineMongoDBBundle/Resources/config/schema/dic/doctrine/odm/mongodb/mongodb-1.0.xsd

@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<xsd:schema xmlns="http://www.symfony-project.org/schema/dic/doctrine/odm/mongodb"
+    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+    targetNamespace="http://www.symfony-project.org/schema/dic/doctrine/odm/mongodb"
+    elementFormDefault="qualified">
+
+  <xsd:element name="odm" type="odm" />
+
+  <xsd:complexType name="odm">
+    <xsd:attribute name="host" type="xsd:string" />
+    <xsd:attribute name="port" type="xsd:integer" />
+    <xsd:attribute name="database" type="xsd:string" />
+    <xsd:attribute name="proxy_dir" type="xsd:string" />
+    <xsd:attribute name="auto_generate_proxy_classes" type="xsd:boolean" />
+    <xsd:attribute name="cache" type="cache" />
+    <xsd:attribute name="metadata" type="metadata" />
+  </xsd:complexType>
+
+  <xsd:simpleType name="cache">
+    <xsd:restriction base="xsd:string">
+      <xsd:enumeration value="array" />
+      <xsd:enumeration value="apc" />
+      <xsd:enumeration value="memcache" />
+      <xsd:enumeration value="xcache" />
+    </xsd:restriction>
+  </xsd:simpleType>
+
+  <xsd:simpleType name="metadata">
+    <xsd:restriction base="xsd:string">
+      <xsd:enumeration value="annotation" />
+      <xsd:enumeration value="xml" />
+      <xsd:enumeration value="yml" />
+    </xsd:restriction>
+  </xsd:simpleType>
+</xsd:schema>