Symfony2 and MongoDB

  • 21,668 views
Uploaded 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 …

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.

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
21,668
On Slideshare
0
From Embeds
0
Number of Embeds
1

Actions

Shares
Downloads
477
Comments
0
Likes
25

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

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