Configurando DoctrineMongoDBBundle

Configuración de ejemplo

# app/config/config.yml
doctrine_mongodb:
    connections:
        default:
            server: mongodb://localhost:27017
            options: {}
    default_database: hello_%kernel.environment%
    document_managers:
        default:
            mappings:
                AcmeDemoBundle: ~
            filters:
                filter-name:
                    class: Class\Example\Filter\ODM\ExampleFilter
                    enabled: true
            metadata_cache_driver: array # array, apc, xcache, memcache

Si deseas utilizar memcache para memorizar tus metadatos, es necesario configurar la instancia Memcache; por ejemplo, puedes hacer lo siguiente:

  • YAML
    # app/config/config.yml
    doctrine_mongodb:
        default_database: hello_%kernel.environment%
        connections:
            default:
                server: mongodb://localhost:27017
                options: {}
        document_managers:
            default:
                mappings:
                    AcmeDemoBundle: ~
                metadata_cache_driver:
                    type: memcache
                    class: Doctrine\Common\Cache\MemcacheCache
                    host: localhost
                    port: 11211
                    instance_class: Memcache
    
  • XML
    <?xml version="1.0" ?>
    
    <container xmlns="http://symfony.com/schema/dic/services"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:doctrine_mongodb="http://symfony.com/schema/dic/doctrine/odm/mongodb"
        xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd
                            http://symfony.com/schema/dic/doctrine/odm/mongodb http://symfony.com/schema/dic/doctrine/odm/mongodb/mongodb-1.0.xsd">
    
        <doctrine_mongodb:config default-database="hello_%kernel.environment%">
            <doctrine_mongodb:document-manager id="default">
                <doctrine_mongodb:mapping name="AcmeDemoBundle" />
                <doctrine_mongodb:metadata-cache-driver type="memcache">
                    <doctrine_mongodb:class>Doctrine\Common\Cache\MemcacheCache</doctrine_mongodb:class>
                    <doctrine_mongodb:host>localhost</doctrine_mongodb:host>
                    <doctrine_mongodb:port>11211</doctrine_mongodb:port>
                    <doctrine_mongodb:instance-class>Memcache</doctrine_mongodb:instance-class>
                </doctrine_mongodb:metadata-cache-driver>
            </doctrine_mongodb:document-manager>
            <doctrine_mongodb:connection id="default" server="mongodb://localhost:27017">
                <doctrine_mongodb:options>
                </doctrine_mongodb:options>
            </doctrine_mongodb:connection>
        </doctrine_mongodb:config>
    </container>
    

Configurando la asignación

La definición explícita de todos los documentos asignados es la única configuración necesaria para ODM y hay varias opciones de configuración que puedes controlar. Existen las siguientes opciones de configuración para una asignación:

  • type Uno de annotations, xml, yml, php o staticphp. Esta especifica cual tipo de metadatos usa el tipo de tu asignación.
  • dir Ruta a los archivos de entidad o asignación (dependiendo del controlador). Si esta ruta es relativa, se supone que es relativa a la raíz del paquete. Esto sólo funciona si el nombre de tu asignación es un nombre de paquete. Si deseas utilizar esta opción para especificar rutas absolutas debes prefijar la ruta con los parámetros del núcleo existentes en el DIC (por ejemplo %kernel.root_dir%).
  • prefix Un prefijo de espacio de nombres común que comparten todos los documentos de esta asignación. Este prefijo no debe entrar en conflicto con otros prefijos definidos por otras asignaciones, de otra manera Doctrine no podrá encontrar algunos de tus documentos. Esta opción, por omisión, es el espacio de nombres del paquete + Document, por ejemplo, para un paquete de la aplicación llamada AcmeHelloBundle, el prefijo sería Acme\HelloBundle\Document.
  • alias Doctrine ofrece una forma simple para rebautizar el espacio de nombres de los documentos, los nombres más cortos se utilizan en las consultas o para acceder al repositorio.
  • is_bundle Esta opción es un valor derivado de dir y por omisión se establece en true si dir es relativo provisto por un file_exists() verifica que devuelve false. Este es false si al comprobar la existencia devuelve true. En este caso has especificado una ruta absoluta y es más probable que los archivos de metadatos estén en un directorio fuera del paquete.

Para evitar tener que configurar un montón de información para tus asignaciones, debes seguir los siguientes convenios:

  1. Pon todos tus documentos en un directorio Document/ dentro de tu paquete. Por ejemplo Acme/HelloBundle/Document/.
  2. Si estás usando asignación xml, php o yml coloca todos tus archivos de configuración en el directorio Resources/config/doctrine/ con el sufijo mongodb.xml, mongodb.yml o mongodb.php respectivamente.
  3. Asume anotaciones si es un Document/ pero no se encuentra el directorio Resources/config/doctrine/.

La siguiente configuración muestra un montón de ejemplos de asignación:

doctrine_mongodb:
    document_managers:
        default:
            mappings:
                MyBundle1: ~
                MyBundle2: yml
                MyBundle3: { type: annotation, dir: Documents/ }
                MyBundle4: { type: xml, dir: Resources/config/doctrine/mapping }
                MyBundle5:
                    type: yml
                    dir: my-bundle-mappings-dir
                    alias: BundleAlias
                doctrine_extensions:
                    type: xml
                    dir: %kernel.root_dir%/../src/vendor/DoctrineExtensions/lib/DoctrineExtensions/Documents
                    prefix: DoctrineExtensions\Documents\
                    alias: DExt

Filtros

Fácilmente puedes añadir filtros a un gestor de documentos utilizando la siguiente sintaxis:

doctrine_mongodb:
    document_managers:
        default:
            filters:
                filter-one:
                    class: Class\ExampleOne\Filter\ODM\ExampleFilter
                    enabled: true
                filter-two:
                    class: Class\ExampleTwo\Filter\ODM\ExampleFilter
                    enabled: false

Los filtros se usan para añadir condiciones al queryBuilder sin tener en cuenta dónde se generó la consulta.

Múltiples conexiones

Si necesitas múltiples conexiones y gestores de documentos puedes utilizar la siguiente sintaxis:

Ahora puedes recuperar los servicios configurados conectando servicios:

$conn1 = $container->get('doctrine_mongodb.odm.conn1_connection');
$conn2 = $container->get('doctrine_mongodb.odm.conn2_connection');

Y también puedes recuperar los gestores de servicios de documentos configurados que utilizan la conexión de servicios anterior:

$dm1 = $container->get('doctrine_mongodb.odm.dm1_document_manager');
$dm2 = $container->get('doctrine_mongodb.odm.dm2_document_manager');

Conectando un grupo de servidores mongodb en 1 conexión

Es posible conectarse a varios servidores mongodb en una conexión si utilizas un conjunto de réplicas haciendo una lista de todos los servidores dentro de la cadena de conexión como una lista separada por comas.

  • YAML
    doctrine_mongodb:
        # ...
        connections:
            default:
                server: 'mongodb://mongodb-01:27017,mongodb-02:27017,mongodb-03:27017'
    

Dónde mongodb-01, mongodb-02 y mongodb-03 son los nombres de las máquinas anfitrionas. También puedes utilizar direcciones IP, si lo prefiere.

Volviendo a intentar conexiones y sonsultas

MongoDB de Doctrine automáticamente es compatible con reintentos de conexión y consultas despues de encontrar una excepción, lo cual es útil cuando tratas con situaciones como conjunto de réplicas para la recuperación de fallos. Esto alivia mucha de la necesidad de capturar las excepciones del controlador MongoDB de PHP en la aplicación y volver a intentar esas operaciones manualmente.

Puedes especificar el número de veces en que se reintentarán las conexiones y consultas a través de las opciones retry_connect y retry_query en la configuración del gestor de documentos. Estas opciones de manerea predeterminada están en cero, lo cual significa que ninguna operación se volverá a intentar.

Configuración predeterminada completa

  • YAML
    doctrine_mongodb:
        document_managers:
    
            # Prototype
            id:
                connection:           ~
                database:             ~
                logging:              true
                auto_mapping:         false
                retry_connect:        0
                retry_query:          0
                metadata_cache_driver:
                    type:                 ~
                    class:                ~
                    host:                 ~
                    port:                 ~
                    instance_class:       ~
                mappings:
    
                    # Prototipo
                name:                 []
                        mapping:              true
                        type:                 ~
                        dir:                  ~
                        prefix:               ~
                        alias:                ~
                        is_bundle:            ~
        connections:
    
            # Prototype
            id:
                server:               ~
                options:
                    connect:              ~
                    persist:              ~
                    timeout:              ~
                    replicaSet:           ~
                    username:             ~
                    password:             ~
        proxy_namespace:      MongoDBODMProxies
        proxy_dir:            %kernel.cache_dir%/doctrine/odm/mongodb/Proxies
        auto_generate_proxy_classes:  false
        hydrator_namespace:   Hydrators
        hydrator_dir:         %kernel.cache_dir%/doctrine/odm/mongodb/Hydrators
        auto_generate_hydrator_classes:  false
        default_document_manager:  ~
        default_connection:   ~
        default_database:     default
Bifúrcame en GitHub