Symfony2 y MongoDB - deSymfony 2012

92
Saturday, June 16, 2012

description

MongoDB es un motor de base de datos NoSQL que ha ganado mucha popularidad en los últimos tiempos, ya que ofrece muchos beneficios a la hora de desarrollar aplicaciones web. En esta charla daremos una breve introducción a su instalación, configuración y funcionamiento. Luego repasaremos las distintas alternativas a la hora de usarlo en nuestras aplicaciones desarrolladas con PHP y Symfony2, y explicaremos cómo puede incrementar la velocidad de desarrollo y ayudar con aplicaciones web de alto rendimiento.

Transcript of Symfony2 y MongoDB - deSymfony 2012

Page 1: Symfony2 y MongoDB - deSymfony 2012

Saturday, June 16, 2012

Page 2: Symfony2 y MongoDB - deSymfony 2012

Saturday, June 16, 2012

Page 3: Symfony2 y MongoDB - deSymfony 2012

¿Quién soy?

⁃ Argentino viviendo en Estados Unidos desde 1999⁃ Desarrollador PHP & Symfony

⁃ Fundador de la primera lista de discusión de PHP de habla hispana

- Socio fundador de ServerGrove ⁃ Maestro de la parrilla

Saturday, June 16, 2012

Page 4: Symfony2 y MongoDB - deSymfony 2012

Saturday, June 16, 2012

Page 5: Symfony2 y MongoDB - deSymfony 2012

Saturday, June 16, 2012

Page 6: Symfony2 y MongoDB - deSymfony 2012

⁃ Fundada en 2005

⁃ Proveedor de servicios de hosting especializado en PHP, Symfony, ZendFramework, y otros

⁃ Servidores en Europa y Estados Unidos

⁃ Mongohosting.com en beta!

ServerGrove!

Saturday, June 16, 2012

Page 7: Symfony2 y MongoDB - deSymfony 2012

⁃ Muy activos en la comunidad de Open Source contribuyendo con código o patrocinando eventos y grupos de usuarios

La comunidad es nuestra guia

Saturday, June 16, 2012

Page 8: Symfony2 y MongoDB - deSymfony 2012

Agenda

- Introducción a MongoDB- PHP y MongoDB- Librerías en PHP- Symfony2 y MongoDB

Saturday, June 16, 2012

Page 9: Symfony2 y MongoDB - deSymfony 2012

¿Qué es MongoDB?

¿Quién es 10Gen?

Saturday, June 16, 2012

Page 10: Symfony2 y MongoDB - deSymfony 2012

MongoMongo viene de "humongous". Usado para describir algo extremadamente grande o importante

Saturday, June 16, 2012

Page 11: Symfony2 y MongoDB - deSymfony 2012

MongoDB es una base de datos NoSQL, escalable, de alta performance

y de código abierto.

- BD orientada a documentos- Escrita en C++

- Disponible en *nux (Linux, Solaris, etc), Windows y OS X

- Muchos drivers (PHP, Java, Python, Ruby...)

Saturday, June 16, 2012

Page 12: Symfony2 y MongoDB - deSymfony 2012

- Documentos flexibles tipo JSON- Soporte completo de Indices- Queries complejos / Map Reduce- Framework de agregación (próximamente)- GridFS (almacena archivos nativamente)- Múltiples opciones de replicación- Sharding- Instalación sencilla con cero configuración

Descripción

Saturday, June 16, 2012

Page 13: Symfony2 y MongoDB - deSymfony 2012

Base de datos => Base de datosTabla => ColecciónFila => Documento

¿Vienes de SQL?

Orientada a Objetos

Saturday, June 16, 2012

Page 14: Symfony2 y MongoDB - deSymfony 2012

{ nombre: { primero: 'Juan', apellido: 'Perez' }, titulo: 'Ingeniero', edad: 40}

Documentos Tipo JSON

Saturday, June 16, 2012

Page 15: Symfony2 y MongoDB - deSymfony 2012

Sin Schema o Tablas Fijas

{ nombre: { primero: 'Juan', apellido: 'Perez' }, titulo: 'Ingeniero', edad: 40, escuela: 'UJI'}

Saturday, June 16, 2012

Page 16: Symfony2 y MongoDB - deSymfony 2012

{ "_id" : ObjectId("4ccba15ef597e9352e060000") "srcFilename" : "/etc/apache2/sites-enabled/example1.com", "vhostDirective" : { "directives" : [ { "name" : "CustomLog", "value" : "logs/example1.com-access_log combined" }, { "name" : "DocumentRoot", "value" : "/var/www/vhosts/example1.com/httpdocs" }, { "name" : "ServerName", "value" : "example1.com" } ] } }

Documentos Embebidos

Saturday, June 16, 2012

Page 17: Symfony2 y MongoDB - deSymfony 2012

{ "_id" : ObjectId("4cc4a5c3f597e9db6e010109"), "billingId" : NumberLong(650), "created" : ISODate("2010-10-24T21:31:47Z"), "servers" : [ { "$ref" : "server", "$id" : ObjectId("4cc4a5c4f597e9db6e050201") }], "users" : [ { "$ref" : "user", "$id" : ObjectId("4cc4a5c4f597e9db6e980201") }, { "$ref" : "user", "$id" : ObjectId("4cc4a5c4f597e9db6e9c0201") }] }

Referencias Entre Documentos

Saturday, June 16, 2012

Page 18: Symfony2 y MongoDB - deSymfony 2012

db.personal.ensureIndex({nombre: 1})

db. personal.ensureIndex({nombre.primer: 1, nombre.apellido: 1})

db. personal.ensureIndex({edad: 0})

Indices

Saturday, June 16, 2012

Page 19: Symfony2 y MongoDB - deSymfony 2012

db.personal.ensureIndex({nombre: 1})

db. personal.ensureIndex({nombre.primer: 1, nombre.apellido: 1})

db. personal.ensureIndex({edad: 0})

Indices

Saturday, June 16, 2012

Page 20: Symfony2 y MongoDB - deSymfony 2012

db.personal.ensureIndex({nombre: 1})

db. personal.ensureIndex({nombre.primer: 1, nombre.apellido: 1})

db. personal.ensureIndex({edad: 0})

Indices

Saturday, June 16, 2012

Page 21: Symfony2 y MongoDB - deSymfony 2012

db. personal.find({nombre: 'Juan'})

db. personal.find({tags: 'symfony'})

db. personal.find({tags: {$in: ['symfony', 'PHP']}}

Consultas

Saturday, June 16, 2012

Page 22: Symfony2 y MongoDB - deSymfony 2012

db. personal.find({nombre: 'Juan'})

db. personal.find({tags: 'symfony'})

db. personal.find({tags: {$in: ['symfony', 'PHP']}}

Consultas

Saturday, June 16, 2012

Page 23: Symfony2 y MongoDB - deSymfony 2012

db. personal.find({nombre: 'Juan'})

db. personal.find({tags: 'symfony'})

db. personal.find({tags: {$in: ['symfony', 'PHP']}}

Consultas

Saturday, June 16, 2012

Page 24: Symfony2 y MongoDB - deSymfony 2012

- Archivos son divididos en “chunks” o partes y son guardados en múltiples documentos

- API transparente

GridFS

Saturday, June 16, 2012

Page 25: Symfony2 y MongoDB - deSymfony 2012

Source: http://www.mongodb.org/display/DOCS/Replication

Replicación

Saturday, June 16, 2012

Page 26: Symfony2 y MongoDB - deSymfony 2012

Source: http://www.mongodb.org/display/DOCS/Introduction

Shards

Saturday, June 16, 2012

Page 27: Symfony2 y MongoDB - deSymfony 2012

wget http://fastdl.mongodb.org/osx/mongodb-osx-x86_64-2.0.4.tgz

tar zxvf mongodb-osx-x86_64-2.0.4.tgz

cd mongodb-osx-x86_64-2.0.4

./mongod

OS X

Simple instalación con cero configuración

Saturday, June 16, 2012

Page 28: Symfony2 y MongoDB - deSymfony 2012

/etc/yum.repos.d/10gen.repo

CentOS Linux

[10gen]name=10gen Repositorybaseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64gpgcheck=0

$ yum install -y mongo-stable-server$ service mongod start

Simple instalación con cero configuración

Saturday, June 16, 2012

Page 29: Symfony2 y MongoDB - deSymfony 2012

mongodumpmongodump -u usuario -p pass

Backups

mongorestoremongorestore -u usuario -p pass

mongoexportmongoexport -u usuario -p pass

mongoimportmongoimport -u usuario -p pass

Saturday, June 16, 2012

Page 30: Symfony2 y MongoDB - deSymfony 2012

Monitoreomongostat

Saturday, June 16, 2012

Page 31: Symfony2 y MongoDB - deSymfony 2012

http://localhost:28017/Monitoreo

Saturday, June 16, 2012

Page 32: Symfony2 y MongoDB - deSymfony 2012

¿Por qué MongoDB es bueno para el desarrollo rápido de

aplicacones web?

Saturday, June 16, 2012

Page 33: Symfony2 y MongoDB - deSymfony 2012

FLEXIBLE

by exfordy

Desarrollo Rápido de Aplicaciones

Sin schema / orientada a documentos

Saturday, June 16, 2012

Page 34: Symfony2 y MongoDB - deSymfony 2012

MIGRACIONES MAS FACILES

by exfordy

Desarrollo Rápido de Aplicaciones

Sin schema / orientada a documentos

Saturday, June 16, 2012

Page 35: Symfony2 y MongoDB - deSymfony 2012

Desarrollo Rápido de Aplicaciones

NO HAY JOINS!

Saturday, June 16, 2012

Page 36: Symfony2 y MongoDB - deSymfony 2012

VELOZ

by xavi talleda

Rendimiento

Saturday, June 16, 2012

Page 37: Symfony2 y MongoDB - deSymfony 2012

ESCALABILIDAD

by Jimee, Jackie, Tom & Asha

Rendimiento

Saturday, June 16, 2012

Page 38: Symfony2 y MongoDB - deSymfony 2012

- No hay transacciones- No hay rollbacks- Valores inseguros por defecto- Locks en Map Reduce

Ojo al piojo!

by Ernst Vikne

Saturday, June 16, 2012

Page 39: Symfony2 y MongoDB - deSymfony 2012

Buenas aplicaciones

- Sistema de manejo de contenidos (CMS)

- Catálogos de productos

- Análisis en tiempo real

- Almacenamiento de logs

Saturday, June 16, 2012

Page 40: Symfony2 y MongoDB - deSymfony 2012

y

Saturday, June 16, 2012

Page 41: Symfony2 y MongoDB - deSymfony 2012

Driver de PECL

pecl install mongoecho “extension=mongo.so >> /path/php.ini”

Linux

OS X

Windowshttps://github.com/mongodb/mongo-php-driver/downloads

http://php-osx.liip.ch/

Saturday, June 16, 2012

Page 42: Symfony2 y MongoDB - deSymfony 2012

<?php

// conectar$m = new Mongo();

// seleccionar una base de datos$db = $m->biblioteca;

// seleccionar una coleccón $collection = $db->libros;

// agregar un documento$obj = array( "titulo" => "RabbitMQ in Action", "autor" => "Alvaro Videla" );$collection->insert($obj);

// agregar otro documento con distintos datos$obj = array( "titulo" => "Desarrollo en Symfony", "pdf" => true );$collection->insert($obj);

// obtener todos los documentos en la colección$cursor = $collection->find();

// iterar los resultadosforeach ($cursor as $obj) {    echo $obj["titulo"] . "\n";}

?>

Uso

Saturday, June 16, 2012

Page 43: Symfony2 y MongoDB - deSymfony 2012

<?php

// guardar un archivo$id = $grid->storeFile("libro.pdf");$libro = $grid->findOne();

// agregar un contador de descargas$libro->file['descargas'] = 0;$grid->save($libro->file);

// incrementar el contador$grid->update(array("_id" => $id), array('$inc' => array("descargas" => 1)));

?>

Almacenamiento de Archivos

Saturday, June 16, 2012

Page 44: Symfony2 y MongoDB - deSymfony 2012

http://php.net/manual/es/mongo.sqltomongo.php

Queries de SQL a Mongo

Saturday, June 16, 2012

Page 45: Symfony2 y MongoDB - deSymfony 2012

Interfaces de Administración- Genghis

http://genghisapp.com/

Saturday, June 16, 2012

Page 46: Symfony2 y MongoDB - deSymfony 2012

- RockMongo

http://code.google.com/p/rock-php/wiki/rock_mongo

Interfaces de Administración

Saturday, June 16, 2012

Page 47: Symfony2 y MongoDB - deSymfony 2012

- php-mongodb-admin

https://github.com/jwage/php-mongodb-admin

Interfaces de Administración

Saturday, June 16, 2012

Page 48: Symfony2 y MongoDB - deSymfony 2012

- mongohosting.com

https://github.com/jwage/php-mongodb-admin

Interfaces de Administración

Saturday, June 16, 2012

Page 49: Symfony2 y MongoDB - deSymfony 2012

- Doctrine ODM

Librerias en PHP

Saturday, June 16, 2012

Page 50: Symfony2 y MongoDB - deSymfony 2012

- Doctrine ODM

- Mandango

Librerias en PHP

Saturday, June 16, 2012

Page 51: Symfony2 y MongoDB - deSymfony 2012

- Doctrine ODM

- Mandango

- varias más...

Librerias en PHP

Saturday, June 16, 2012

Page 52: Symfony2 y MongoDB - deSymfony 2012

Doctrine MongoDB ODM

http://doctrine-project.org

Doctrine MongoDB Object Document Mapper (ODM) está desarrollado para PHP 5.3.2+ y

provee persistencia transparente de objetos PHP.

Saturday, June 16, 2012

Page 53: Symfony2 y MongoDB - deSymfony 2012

Doctrine MongoDB ODM

bin_data_custombin_data_funcbin_data_md5bin_databin_data_uuidbooleandatefile

Tipos de Mappings

float hashidintkeystringtimestampincrement

Saturday, June 16, 2012

Page 54: Symfony2 y MongoDB - deSymfony 2012

Doctrine MongoDB ODM

bin_data_custombin_data_funcbin_data_md5bin_databin_data_uuidbooleandatefile

Tipos de Mappings

float hashidintkeystringtimestampincrement

Saturday, June 16, 2012

Page 55: Symfony2 y MongoDB - deSymfony 2012

Doctrine MongoDB ODM

bin_data_custombin_data_funcbin_data_md5bin_databin_data_uuidbooleandatefile

Tipos de Mappings

float hashidintkeystringtimestampincrement

Saturday, June 16, 2012

Page 56: Symfony2 y MongoDB - deSymfony 2012

Doctrine MongoDB ODM

bin_data_custombin_data_funcbin_data_md5bin_databin_data_uuidbooleandatefile

Tipos de Mappings

float hashidintkeystringtimestampincrement

Saturday, June 16, 2012

Page 57: Symfony2 y MongoDB - deSymfony 2012

Doctrine MongoDB ODM

bin_data_custombin_data_funcbin_data_md5bin_databin_data_uuidbooleandatefile

Tipos de Mappings

float hashidintkeystringtimestampincrement

Saturday, June 16, 2012

Page 58: Symfony2 y MongoDB - deSymfony 2012

Doctrine MongoDB ODM

bin_data_custombin_data_funcbin_data_md5bin_databin_data_uuidbooleandatefile

Tipos de Mappings

float hashidintkeystringtimestampincrement

Saturday, June 16, 2012

Page 59: Symfony2 y MongoDB - deSymfony 2012

Doctrine MongoDB ODM

bin_data_custombin_data_funcbin_data_md5bin_databin_data_uuidbooleandatefile

Tipos de Mappings

float hashidintkeystringtimestampincrement

Saturday, June 16, 2012

Page 60: Symfony2 y MongoDB - deSymfony 2012

Doctrine MongoDB ODM

bin_data_custombin_data_funcbin_data_md5bin_databin_data_uuidbooleandatefile

Tipos de Mappings

float hashidintkeystringtimestampincrement

Saturday, June 16, 2012

Page 61: Symfony2 y MongoDB - deSymfony 2012

Doctrine MongoDB ODM

Campos “AutoIncrement”<?php

/** Document */class MiClase{ /** @Id(strategy="INCREMENT") */ private $id;

public function getId() { return $this->id; }

//...}

Saturday, June 16, 2012

Page 62: Symfony2 y MongoDB - deSymfony 2012

Doctrine MongoDB ODMTipos propios<?php

namespace My\Project\Types;

use Doctrine\DBAL\Types\Type;use Doctrine\DBAL\Platforms\AbstractPlatform;

/** * My custom datatype. */class MyType extends Type{ public function convertToPHPValue($value) { // This is executed when the value is read from the database. Make your conversions here. }

public function convertToDatabaseValue($value) { // This is executed when the value is written to the database. Make your conversions here. }}

Saturday, June 16, 2012

Page 63: Symfony2 y MongoDB - deSymfony 2012

Doctrine MongoDB ODMMúltiples tipos en una misma colección/** * @Document(collection="documentos") * @DiscriminatorField(fieldName="type") * @DiscriminatorMap({"article"="Articulo", "album"="Album"}) */class Articulo{ // ...}

/** * @Document(collection="documentos") * @DiscriminatorField(fieldName="type") * @DiscriminatorMap({"article"="Articulo", "album"="Album"}) */class Album{ // ...}

Saturday, June 16, 2012

Page 64: Symfony2 y MongoDB - deSymfony 2012

/** @Document */class Usuario{ /** @Id */ private $id;

/** @String */ private $nombre;

/** @String */ private $email;

/** @ReferenceMany(targetDocument="Articulo", cascade="all") */ private $articulos = array();

// ...}

Doctrine MongoDB ODM

Saturday, June 16, 2012

Page 65: Symfony2 y MongoDB - deSymfony 2012

/** @Document */class Articulo{ /** @Id */ private $id;

/** @String */ private $titulo;

/** @String */ private $contenido;

/** @Date */ private $createdAt;

// ...}

Doctrine MongoDB ODM

Saturday, June 16, 2012

Page 66: Symfony2 y MongoDB - deSymfony 2012

<?php

// crear un usuario$user = new Usuario();$user->setNombre('Juan P.');$user->setEmail('[email protected]');

// avisale a Doctrine2 que guarde $usuario en el próximo flush()$dm->persist($usuario);

// crear un articulo$articulo = new Articulo();$articulo->setTitulo('Mi primer articulo');$articulo->setContenido('MongoDB + Doctrine 2 ODM = espectacular!');$articulo->setCreatedAt(new DateTime());

$user->agregarArticulo($articulo);

// guarda todo en MongoDB$dm->flush();

Doctrine MongoDB ODM

Saturday, June 16, 2012

Page 67: Symfony2 y MongoDB - deSymfony 2012

<?php

// crear un usuario$usuario = new Usuario();$usuario->setNombre('Juan P.');$usuario->setEmail('[email protected]');

// avisale a Doctrine2 que guarde $usuario en el próximo flush()$dm->persist($usuario);

// crear un articulo$articulo = new Articulo();$articulo->setTitulo('Mi primer articulo');$articulo->setContenido('MongoDB + Doctrine 2 ODM = espectacular!');$articulo->setCreatedAt(new DateTime());

$user->addArticulo($articulo);

// guarda todo en MongoDB$dm->flush($usuario);

Doctrine MongoDB ODM

Saturday, June 16, 2012

Page 68: Symfony2 y MongoDB - deSymfony 2012

<?php

// crear un usuario$user = new Usuario();$user->setNombre('Juan P.');$user->setEmail('[email protected]');

// avisale a Doctrine2 que guarde $usuario en el próximo flush()$dm->persist($usuario);

// crear un articulo$articulo = new Articulo();$articulo->setTitulo('Mi primer articulo');$articulo->setContenido('MongoDB + Doctrine 2 ODM = espectacular!');$articulo->setCreatedAt(new DateTime());

$user->agregarArticulo($articulo);

// guarda todo en MongoDB$dm->flush($usuario, false);

Doctrine MongoDB ODM

Saturday, June 16, 2012

Page 69: Symfony2 y MongoDB - deSymfony 2012

Array( [_id] => 4bec5869fdc212081d000000 [titulo] => My First Blog Post [contenido] => MongoDB + Doctrine 2 ODM = awesomeness! [createdAt] => MongoDate Object ( [sec] => 1273723200 [usec] => 0 ))

Doctrine MongoDB ODM

Saturday, June 16, 2012

Page 70: Symfony2 y MongoDB - deSymfony 2012

Array( [_id] => 4bec5869fdc212081d010000 [nombre] => Bulat S. [email] => [email protected] [articulos] => Array ( [0] => Array ( [$ref] => Articulo [$id] => 4bec5869fdc212081d000000 [$db] => test_database ) ))

Doctrine MongoDB ODM

Saturday, June 16, 2012

Page 71: Symfony2 y MongoDB - deSymfony 2012

$usuario = $dm->find('Usuario', $idDelUsuario);

$usuario = $dm->getRepository('Usuario')->findOneByNombre('Juan');

$articulos = $usuario->getArticulos();foreach ($articulos as $articulo) { echo $articulo;}

Doctrine MongoDB ODM

Saturday, June 16, 2012

Page 72: Symfony2 y MongoDB - deSymfony 2012

// src/TuNamespace/TuBundle/ServerRepository.phpnamespace TuNamespace\TuBundle;

use Doctrine\ODM\MongoDB\DocumentRepository;

class ServerRepository extends DocumentRepository{ public function getActiveServers() { return $this->createQueryBuilder() ->field('isActive')->equals(true) ->sort('name', 'asc')->getQuery()->execute(); }

Repositorios de documents

$rep = $dm->getRepository(‘@TuBundle/Server’);$servers = $rep->getActiveServers();

Usage

Doctrine MongoDB ODM

Saturday, June 16, 2012

Page 73: Symfony2 y MongoDB - deSymfony 2012

/** @Document */class Imagen{ /** @Id */ private $id;

/** @Field */ private $nombre;

/** @File */ private $file;

Doctrine MongoDB ODM

Saturday, June 16, 2012

Page 74: Symfony2 y MongoDB - deSymfony 2012

// guardar archivo$imagen = new Imagen();$imagen->setNombre('Imagen de prueba');$imagen->setFile('/path/to/imagen.png');

$dm->persist($imagen);$dm->flush();

// obtener documento y enviar archivo al cliente HTTP$imagen = $dm->createQueryBuilder('Documents\Imagen') ->field('nombre')->equals('Imagen de prueba') ->getQuery() ->getSingleResult();

header('Content-type: image/png;');echo $imagen->getFile()->getBytes();

Doctrine MongoDB ODM

Saturday, June 16, 2012

Page 75: Symfony2 y MongoDB - deSymfony 2012

Saturday, June 16, 2012

Page 76: Symfony2 y MongoDB - deSymfony 2012

¡No necesita introducción!

Saturday, June 16, 2012

Page 77: Symfony2 y MongoDB - deSymfony 2012

Bundles de Symfony2

- DoctrineMongoDBBundle

Saturday, June 16, 2012

Page 78: Symfony2 y MongoDB - deSymfony 2012

Bundles de Symfony2

- DoctrineMongoDBBundle

- MandangoBundle

Saturday, June 16, 2012

Page 79: Symfony2 y MongoDB - deSymfony 2012

DoctrineMongoDBBundle

Instalación en Symfony 2.0

[doctrine-mongodb] git=http://github.com/doctrine/mongodb.git

[doctrine-mongodb-odm] git=http://github.com/doctrine/mongodb-odm.git

[DoctrineMongoDBBundle] git=http://github.com/doctrine/DoctrineMongoDBBundle.git target=/bundles/Symfony/Bundle/DoctrineMongoDBBundle version=v2.0.0

$ ./bin/vendors install

deps

Saturday, June 16, 2012

Page 80: Symfony2 y MongoDB - deSymfony 2012

DoctrineMongoDBBundle

Instalación en Symfony 2.1 con Composer

{ require: { "doctrine/mongodb-odm-bundle": "dev-master" }}

$ php composer.phar update

composer.json

Saturday, June 16, 2012

Page 81: Symfony2 y MongoDB - deSymfony 2012

Configurando Symfony2.1

use Doctrine\Common\Annotations\AnnotationRegistry;

AnnotationRegistry::registerFile(__DIR__.'/../vendor/doctrine/mongodb-odm/lib/Doctrine/ODM/MongoDB/Mapping/Annotations/DoctrineAnnotations.php');

app/autoload.php

DoctrineMongoDBBundle

Saturday, June 16, 2012

Page 82: Symfony2 y MongoDB - deSymfony 2012

doctrine_mongodb: connections: default: server: mongodb://localhost:27017 options: connect: true default_database: test_database document_managers: default: auto_mapping: true

app/config/config.yml

DoctrineMongoDBBundleConfigurando Symfony2.1

Saturday, June 16, 2012

Page 83: Symfony2 y MongoDB - deSymfony 2012

app/config/config.ymldoctrine_mongodb: connections: default: server: mongodb://localhost:27017 options: connect: true

usage: server: mongodb://user:[email protected]:27017 options: replicaSet: true connect: true default_database: test_database document_managers: default: mappings: SGCBundle: ~ SGCRepositoryAppBundle: yml MiBundle: { type: xml, dir: Resources/config/doctrine/mapping }

DoctrineMongoDBBundle

Saturday, June 16, 2012

Page 84: Symfony2 y MongoDB - deSymfony 2012

Definiendo Documentos

DoctrineMongoDBBundle

Saturday, June 16, 2012

Page 85: Symfony2 y MongoDB - deSymfony 2012

Definiendo Documentos// src/Acme/StoreBundle/Document/Product.phpnamespace Acme\StoreBundle\Document;

use Doctrine\ODM\MongoDB\Mapping\Annotations as MongoDB;

/** * @MongoDB\Document(collection="product") */class Product{ /** * @MongoDB\Id */ protected $id;

/** * @MongoDB\String @MongoDB\Index(unique=true, order="asc") */ protected $name;

DoctrineMongoDBBundle

Saturday, June 16, 2012

Page 86: Symfony2 y MongoDB - deSymfony 2012

Usando Documentos// src/Acme/StoreBundle/Controller/DefaultController.phpuse Acme\StoreBundle\Document\Product;use Symfony\Component\HttpFoundation\Response;// ...

public function createAction(){ $product = new Product(); $product->setName('A Foo Bar'); $product->setPrice('19.99');

$dm = $this->get('doctrine.odm.mongodb.document_manager'); $dm->persist($product); $dm->flush();

return new Response('Created product id '.$product->getId());}

DoctrineMongoDBBundle

Saturday, June 16, 2012

Page 87: Symfony2 y MongoDB - deSymfony 2012

Consumiendo Mongo directamente// src/Acme/StoreBundle/Controller/DefaultController.phpuse Symfony\Component\HttpFoundation\Response;// ...

public function createAction(){ $dm = $this->get('doctrine.odm.mongodb.document_manager'); $mongo = $dm->getConnection()->getMongo()); $resultado = $mongo->miBD->miColleccion->find();

...

DoctrineMongoDBBundle

Saturday, June 16, 2012

Page 88: Symfony2 y MongoDB - deSymfony 2012

FormulariosDebido a que los documentos son objetos simples de PHP, integrar los formularios es extremadamente sencillo.

public function createAction(){ $dm = $this->get('doctrine.odm.mongodb.default_document_manager');

$form = $this->createForm(new RegistrationType(), new Registration());

$form->bindRequest($this->getRequest());

if ($form->isValid()) { $registration = $form->getData();

$dm->persist($registration->getUser()); $dm->flush();

return $this->redirect(...); }

http://symfony.com/doc/master/bundles/DoctrineMongoDBBundle/form.html

Saturday, June 16, 2012

Page 89: Symfony2 y MongoDB - deSymfony 2012

Comandos de Symfony2doctrine doctrine:mongodb:cache:clear-metadata Clear all metadata cache for a document manager. doctrine:mongodb:fixtures:load Load data fixtures to your database. doctrine:mongodb:generate:documents Generate document classes and method stubs from your mapping information. doctrine:mongodb:generate:hydrators Generates hydrator classes for document classes. doctrine:mongodb:generate:proxies Generates proxy classes for document classes. doctrine:mongodb:generate:repositories Generate repository classes from your mapping information. doctrine:mongodb:mapping:info Show basic information about all mapped documents. doctrine:mongodb:query Query mongodb and inspect the outputted results from your document classes. doctrine:mongodb:schema:create Allows you to create databases, collections and indexes for your documents doctrine:mongodb:schema:drop Allows you to drop databases, collections and indexes for your documents

Comandos

Saturday, June 16, 2012

Page 90: Symfony2 y MongoDB - deSymfony 2012

Bundles que usan MongoDB

- SonataDoctrineMongoDBAdminBundle

- IsmaAmbrosiGeneratorBundle

- EbutikMongoSessionBundle

- TranslationEditorBundle

- ServerGroveLiveChat

Saturday, June 16, 2012

Page 91: Symfony2 y MongoDB - deSymfony 2012

¿Preguntas?

Saturday, June 16, 2012

Page 92: Symfony2 y MongoDB - deSymfony 2012

¡Muchas Gracias!

Transparencias: http://slideshare.net/pgodelTwitter: @pgodel

Saturday, June 16, 2012