• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
Symfony2 and MongoDB
 

Symfony2 and MongoDB

on

  • 19,673 views

See how to use MongoDB in Symfony2 projects to speed up the development of web applications. We will give an introduction of MongoDB as a NoSQL database server and look at the options on how to work ...

See how to use MongoDB in Symfony2 projects to speed up the development of web applications. We will give an introduction of MongoDB as a NoSQL database server and look at the options on how to work with it from Symfony2 and PHP applications.

Statistics

Views

Total Views
19,673
Views on SlideShare
19,619
Embed Views
54

Actions

Likes
24
Downloads
224
Comments
0

2 Embeds 54

https://twitter.com 51
https://twimg0-a.akamaihd.net 3

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    Symfony2 and MongoDB Symfony2 and MongoDB Presentation Transcript

    • Pablo Godel @pgodel - 2012.phpDay.it May 18th 2012 - Verona, Italy https://joind.in/6383Friday, May 18, 2012
    • Who Am I? ⁃ Born in Argentina, living in the US since 1999 ⁃ PHP & Symfony developer ⁃ Founder of the original PHP mailing list in spanish ⁃ Master of the parrillaFriday, May 18, 2012
    • Who Am I? ⁃ Born in Argentina, living in the US since 1999 ⁃ PHP & Symfony developer ⁃ Founder of the original PHP mailing list in spanish ⁃ Master of the parrillaFriday, May 18, 2012
    • Friday, May 18, 2012
    • ServerGrove! ⁃ Founded ServerGrove Networks in 2005 ⁃ Provider of web hosting specialized in PHP, Symfony, ZendFramework, and others ⁃ Mongohosting.com under beta!Friday, May 18, 2012
    • Community is our teacher ⁃ Very active open source supporter through code contributions and usergroups/conference sponsoringFriday, May 18, 2012
    • Agenda - Introduction to MongoDB - PHP and MongoDB - PHP Libraries - Symfony2 and MongoDBFriday, May 18, 2012
    • What is MongoDB? Who is 10Gen?Friday, May 18, 2012
    • Mongo Mongo as in "humongous". Used to describe something extremely large or important.Friday, May 18, 2012
    • MongoDB is a scalable, high-performance, open source NoSQL database. - Document Oriented DB - Written in C++ - Available for *nux (Linux, Solaris, etc), Windows and OS X - Lots of Drivers (PHP, Java, Python, Ruby...)Friday, May 18, 2012
    • Features - Flexible JSON-style documents - Full Indexing - Complex Queries / Map Reduce - Aggregation Framework (coming soon) - GridFS (store files natively) - Multiple Replication Options - Sharding - Simple Installation / Zero ConfigFriday, May 18, 2012
    • Document Oriented Coming from SQL? Database => Database Table => Collection Row => DocumentFriday, May 18, 2012
    • JSON-style documents { name: { first: John, last: Doe }, title: Engineer, age: 40 }Friday, May 18, 2012
    • No Schema or fixed tables { name: { first: Foo, last: Bar }, title: Student, school: Harvard }Friday, May 18, 2012
    • Embedded documents { "_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" } ] } }Friday, May 18, 2012
    • Document Referencing { "_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") } ] }Friday, May 18, 2012
    • Full Indexing db.coll.ensureIndex({name.last: 1}) db.coll.ensureIndex({name.first: 1, name.last: 1}) db.coll.ensureIndex({age: 0})Friday, May 18, 2012
    • Querying db.coll.find({name: John}) db.coll.find({keywords: storage}) db.coll.find({keywords: {$in: [storage, DBMS]}}Friday, May 18, 2012
    • GridFS - Files are divided in chunks and stored over multiple documents - Transparent APIFriday, May 18, 2012
    • Replication Source: http://www.mongodb.org/display/DOCS/ReplicationFriday, May 18, 2012
    • Shards Source: http://www.mongodb.org/display/DOCS/IntroductionFriday, May 18, 2012
    • Simple Installation/Zero Config OS X 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 ./mongodFriday, May 18, 2012
    • Simple Installation/Zero Config CentOS Linux /etc/yum.repos.d/10gen.repo [10gen] name=10gen Repository baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64 gpgcheck=0 $ yum install -y mongo-stable-server $ service mongod startFriday, May 18, 2012
    • Why is MongoDB good for Rapid Development of Web Apps?Friday, May 18, 2012
    • Rapid Development Schema-less / Document Oriented FLEXIBILITY by exfordyFriday, May 18, 2012
    • Rapid Development Schema-less / Document Oriented EASIER MIGRATIONS by exfordyFriday, May 18, 2012
    • Rapid Development NO JOINS!Friday, May 18, 2012
    • Performance SPEED by xavi talledaFriday, May 18, 2012
    • Performance SCALABILITY by Jimee, Jackie, Tom & AshaFriday, May 18, 2012
    • A Word of Caution No Transactions No Rollbacks Unsafe defaults Map Reduce locks by Ernst VikneFriday, May 18, 2012
    • Great Use Cases - Content Management - Product Catalogs - Realtime Analytics - Logs StorageFriday, May 18, 2012
    • andFriday, May 18, 2012
    • PECL driver Linux pecl install mongo echo “extension=mongo.so >> /path/php.ini” OS X http://php-osx.liip.ch/ Windows https://github.com/mongodb/mongo-php-driver/downloadsFriday, May 18, 2012
    • Usage <?php // connect $m = new Mongo(); // select a database $db = $m->comedy; // select a collection (analogous to a relational databases table) $collection = $db->cartoons; // add a record $obj = array ( "title" => "Calvin and Hobbes", "author" => "Bill Watterson" ); $collection->insert($obj); // add another record, with a different "shape" $obj = array( "title" => "XKCD", "online" => true ); $collection->insert($obj); // find everything in the collection $cursor = $collection->find(); // iterate through the results foreach ($cursor as $obj) {     echo $obj["title"] . "n"; } ?>Friday, May 18, 2012
    • Storing Files <?php // save a file $id = $grid->storeFile("game.tgz"); $game = $grid->findOne(); // add a downloads counter $game->file[downloads] = 0; $grid->save($game->file); // increment the counter $grid->update(array("_id" => $id), array($inc => array ("downloads" => 1))); ?>Friday, May 18, 2012
    • SQL to Mongo Queries SQL to Mongo Mapping Chart This is a PHP-specific version of the » SQL to Mongo mapping chart in the main docs. SQL Statement Mongo Query Language Statement CREATE TABLE USERS (a Number, b Number) Implicit or use MongoDB::createCollection(). INSERT INTO USERS VALUES(1,1) $db->users->insert(array("a" => 1, "b" => 1)); SELECT a,b FROM users $db->users->find(array(), array("a" => 1, "b" => 1)); SELECT * FROM users WHERE age=33 $db->users->find(array("age" => 33)); SELECT a,b FROM users WHERE age=33 $db->users->find(array("age" => 33), array("a" => 1, "b" => 1)); SELECT a,b FROM users WHERE age=33 ORDER BY name $db->users->find(array("age" => 33), array("a" => 1, "b" => 1))->sort(array("name" => 1)); SELECT * FROM users WHERE age>33 $db->users->find(array("age" => array($gt => 33))); SELECT * FROM users WHERE age<33 $db->users->find(array("age" => array($lt => 33))); SELECT * FROM users WHERE name LIKE "%Joe%" $db->users->find(array("name" => new MongoRegex("/Joe/"))); SELECT * FROM users WHERE name LIKE "Joe%" $db->users->find(array("name" => new MongoRegex("/^Joe/"))); SELECT * FROM users WHERE age>33 AND age<=40 $db->users->find(array("age" => array($gt => 33, $lte => 40))); SELECT * FROM users ORDER BY name DESC http://php.net/manual/en/mongo.sqltomongo.phpFriday, May 18, 2012
    • Admin Interfaces - Genghis http://genghisapp.com/ - RockMongo http://code.google.com/p/rock-php/wiki/rock_mongo - php-mongodb-admin https://github.com/jwage/php-mongodb-adminFriday, May 18, 2012
    • PHP Libraries - Doctrine ODM - Mandango - many more...Friday, May 18, 2012
    • Doctrine MongoDB ODM http://doctrine-project.org Doctrine MongoDB Object Document Mapper is built for PHP 5.3.2+ and provides transparent persistence for PHP objects.Friday, May 18, 2012
    • Doctrine MongoDB ODM /** @Document */ class User { /** @Id */ private $id; /** @String */ private $name; /** @String */ private $email; /** @ReferenceMany(targetDocument="BlogPost", cascade="all") */ private $posts = array(); // ... }Friday, May 18, 2012
    • Doctrine MongoDB ODM /** @Document */ class BlogPost { /** @Id */ private $id; /** @String */ private $title; /** @String */ private $body; /** @Date */ private $createdAt; // ... }Friday, May 18, 2012
    • Doctrine MongoDB ODM <?php // create user $user = new User(); $user->setName(Bulat S.); $user->setEmail(email@example.com); // tell Doctrine 2 to save $user on the next flush() $dm->persist($user); // create blog post $post = new BlogPost(); $post->setTitle(My First Blog Post); $post->setBody(MongoDB + Doctrine 2 ODM = awesomeness!); $post->setCreatedAt(new DateTime()); $user->addPost($post); // store everything to MongoDB $dm->flush();Friday, May 18, 2012
    • Doctrine MongoDB ODM Array ( [_id] => 4bec5869fdc212081d000000 [title] => My First Blog Post [body] => MongoDB + Doctrine 2 ODM = awesomeness! [createdAt] => MongoDate Object ( [sec] => 1273723200 [usec] => 0 ) )Friday, May 18, 2012
    • Doctrine MongoDB ODM Array ( [_id] => 4bec5869fdc212081d010000 [name] => Bulat S. [email] => email@example.com [posts] => Array ( [0] => Array ( [$ref] => blog_posts [$id] => 4bec5869fdc212081d000000 [$db] => test_database ) ) )Friday, May 18, 2012
    • Doctrine MongoDB ODM $user = $dm->find(User, $userId); $user = $dm->getRepository(User)->findOneByName(Bulat S.); $posts = $user->getPosts(); foreach ($posts as $post) { echo $post; }Friday, May 18, 2012
    • Doctrine MongoDB ODM Document Repositories // src/YourNamespace/YourBundle/ServerRepository.php namespace YourNamespaceYourBundle; use DoctrineODMMongoDBDocumentRepository; class ServerRepository extends DocumentRepository { public function getActiveServers() { return $this->createQueryBuilder() ->field(isActive)->equals(true) ->sort(name, asc)->getQuery()->execute(); } Usage $rep = $dm->getRepository(‘@YourBundle/Server’); $servers = $rep->getActiveServers();Friday, May 18, 2012
    • Doctrine MongoDB ODM /** @Document */ class Image { /** @Id */ private $id; /** @Field */ private $name; /** @File */ private $file;Friday, May 18, 2012
    • Doctrine MongoDB ODM // store file $image = new Image(); $image->setName(Test image); $image->setFile(/path/to/image.png); $dm->persist($image); $dm->flush(); // retrieve and return file to client $image = $dm->createQueryBuilder(DocumentsImage) ->field(name)->equals(Test image) ->getQuery() ->getSingleResult(); header(Content-type: image/png;); echo $image->getFile()->getBytes();Friday, May 18, 2012
    • Symfony is a PHP Web Development Framework.Friday, May 18, 2012
    • Symfony2 Bundles - DoctrineMongoDBBundle - MandangoBundleFriday, May 18, 2012
    • DoctrineMongoDBBundle Installation with Composer composer.json { require: { "doctrine/mongodb-odm-bundle": "dev-master" } } $ php composer.phar updateFriday, May 18, 2012
    • DoctrineMongoDBBundle Configuring Symfony2 app/autoload.php use DoctrineCommonAnnotationsAnnotationRegistry; AnnotationRegistry::registerFile(__DIR__./../vendor/doctrine- mongodb-odm/lib/Doctrine/ODM/MongoDB/Mapping/Annotations/ DoctrineAnnotations.php);Friday, May 18, 2012
    • DoctrineMongoDBBundle Configuring Symfony2 app/config/config.yml doctrine_mongodb: connections: default: server: mongodb://localhost:27017 options: connect: true default_database: test_database document_managers: default: auto_mapping: trueFriday, May 18, 2012
    • DoctrineMongoDBBundle app/config/config.yml doctrine_mongodb: connections: default: server: mongodb://localhost:27017 options: connect: true usage: server: mongodb://user:pass@db1.mongohosting.com:27017 options: replicaSet: true connect: true default_database: test_database document_managers: default: mappings: SGCBundle: ~ SGCRepositoryAppBundle: yml MyBundle: { type: xml, dir: Resources/config/doctrine/ mapping }Friday, May 18, 2012
    • DoctrineMongoDBBundle Defining DocumentsFriday, May 18, 2012
    • DoctrineMongoDBBundle Defining Documents // src/Acme/StoreBundle/Document/Product.php namespace AcmeStoreBundleDocument; use DoctrineODMMongoDBMappingAnnotations as MongoDB; /** * @MongoDBDocument(collection="product") */ class Product { /** * @MongoDBId */ protected $id; /** * @MongoDBString @MongoDBIndex(unique=true, order="asc") */ protected $name;Friday, May 18, 2012
    • DoctrineMongoDBBundle Using Documents // src/Acme/StoreBundle/Controller/DefaultController.php use AcmeStoreBundleDocumentProduct; use SymfonyComponentHttpFoundationResponse; // ... 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()); }Friday, May 18, 2012
    • Forms Since Documents are Plain PHP Objects integrating it with Symfony Forms is straightforward. 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.htmlFriday, May 18, 2012
    • Commands Symfony2 Commands doctrine 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 documentsFriday, May 18, 2012
    • Bundles using MongoDB - SonataDoctrineMongoDBAdminBundle - IsmaAmbrosiGeneratorBundle - EbutikMongoSessionBundle - TranslationEditorBundle - ServerGroveLiveChatFriday, May 18, 2012
    • Questions?Friday, May 18, 2012
    • Thank you! Rate Me Please! https://joind.in/6383 Slides: http://slideshare.net/pgodel Twitter: @pgodel E-mail: pablo@servergrove.comFriday, May 18, 2012