Symfony2 and MongoDB

26,780
-1

Published on

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.

Published in: Technology
0 Comments
32 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
26,780
On Slideshare
0
From Embeds
0
Number of Embeds
7
Actions
Shares
0
Downloads
521
Comments
0
Likes
32
Embeds 0
No embeds

No notes for slide

Symfony2 and MongoDB

  1. 1. Pablo Godel @pgodel - 2012.phpDay.it May 18th 2012 - Verona, Italy https://joind.in/6383Friday, May 18, 2012
  2. 2. 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
  3. 3. 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
  4. 4. Friday, May 18, 2012
  5. 5. 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
  6. 6. Community is our teacher ⁃ Very active open source supporter through code contributions and usergroups/conference sponsoringFriday, May 18, 2012
  7. 7. Agenda - Introduction to MongoDB - PHP and MongoDB - PHP Libraries - Symfony2 and MongoDBFriday, May 18, 2012
  8. 8. What is MongoDB? Who is 10Gen?Friday, May 18, 2012
  9. 9. Mongo Mongo as in "humongous". Used to describe something extremely large or important.Friday, May 18, 2012
  10. 10. 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
  11. 11. 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
  12. 12. Document Oriented Coming from SQL? Database => Database Table => Collection Row => DocumentFriday, May 18, 2012
  13. 13. JSON-style documents { name: { first: John, last: Doe }, title: Engineer, age: 40 }Friday, May 18, 2012
  14. 14. No Schema or fixed tables { name: { first: Foo, last: Bar }, title: Student, school: Harvard }Friday, May 18, 2012
  15. 15. 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
  16. 16. 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
  17. 17. 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
  18. 18. Querying db.coll.find({name: John}) db.coll.find({keywords: storage}) db.coll.find({keywords: {$in: [storage, DBMS]}}Friday, May 18, 2012
  19. 19. GridFS - Files are divided in chunks and stored over multiple documents - Transparent APIFriday, May 18, 2012
  20. 20. Replication Source: http://www.mongodb.org/display/DOCS/ReplicationFriday, May 18, 2012
  21. 21. Shards Source: http://www.mongodb.org/display/DOCS/IntroductionFriday, May 18, 2012
  22. 22. 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
  23. 23. 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
  24. 24. Why is MongoDB good for Rapid Development of Web Apps?Friday, May 18, 2012
  25. 25. Rapid Development Schema-less / Document Oriented FLEXIBILITY by exfordyFriday, May 18, 2012
  26. 26. Rapid Development Schema-less / Document Oriented EASIER MIGRATIONS by exfordyFriday, May 18, 2012
  27. 27. Rapid Development NO JOINS!Friday, May 18, 2012
  28. 28. Performance SPEED by xavi talledaFriday, May 18, 2012
  29. 29. Performance SCALABILITY by Jimee, Jackie, Tom & AshaFriday, May 18, 2012
  30. 30. A Word of Caution No Transactions No Rollbacks Unsafe defaults Map Reduce locks by Ernst VikneFriday, May 18, 2012
  31. 31. Great Use Cases - Content Management - Product Catalogs - Realtime Analytics - Logs StorageFriday, May 18, 2012
  32. 32. andFriday, May 18, 2012
  33. 33. 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
  34. 34. 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
  35. 35. 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
  36. 36. 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
  37. 37. 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
  38. 38. PHP Libraries - Doctrine ODM - Mandango - many more...Friday, May 18, 2012
  39. 39. 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
  40. 40. 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
  41. 41. Doctrine MongoDB ODM /** @Document */ class BlogPost { /** @Id */ private $id; /** @String */ private $title; /** @String */ private $body; /** @Date */ private $createdAt; // ... }Friday, May 18, 2012
  42. 42. 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
  43. 43. 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
  44. 44. 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
  45. 45. 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
  46. 46. 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
  47. 47. Doctrine MongoDB ODM /** @Document */ class Image { /** @Id */ private $id; /** @Field */ private $name; /** @File */ private $file;Friday, May 18, 2012
  48. 48. 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
  49. 49. Symfony is a PHP Web Development Framework.Friday, May 18, 2012
  50. 50. Symfony2 Bundles - DoctrineMongoDBBundle - MandangoBundleFriday, May 18, 2012
  51. 51. DoctrineMongoDBBundle Installation with Composer composer.json { require: { "doctrine/mongodb-odm-bundle": "dev-master" } } $ php composer.phar updateFriday, May 18, 2012
  52. 52. 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
  53. 53. 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
  54. 54. 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
  55. 55. DoctrineMongoDBBundle Defining DocumentsFriday, May 18, 2012
  56. 56. 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
  57. 57. 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
  58. 58. 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
  59. 59. 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
  60. 60. Bundles using MongoDB - SonataDoctrineMongoDBAdminBundle - IsmaAmbrosiGeneratorBundle - EbutikMongoSessionBundle - TranslationEditorBundle - ServerGroveLiveChatFriday, May 18, 2012
  61. 61. Questions?Friday, May 18, 2012
  62. 62. Thank you! Rate Me Please! https://joind.in/6383 Slides: http://slideshare.net/pgodel Twitter: @pgodel E-mail: pablo@servergrove.comFriday, May 18, 2012
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×