Pablo Godel @pgodel - MidwestPHP 2013             March 2nd 2013 - St. Paul, MN                  https://joind.in/8211Sund...
Who Am I?    ⁃ Born in Argentina, living in the US since 1999    ⁃ PHP & Symfony developer    ⁃ Founder of the original PH...
Sunday, March 3, 13
Sunday, March 3, 13
ServerGrove!      ⁃ Founded ServerGrove Networks in 2005      ⁃ Provider of web hosting specialized in PHP,        Symfony...
Community is our teacher            ⁃ Very active open source supporter through code              contributions and usergr...
Agenda                      - Introduction to MongoDB                      - PHP and MongoDB                      - PHP Li...
What is MongoDB?                       Who is 10Gen?Sunday, March 3, 13
Mongo                      Mongo as in "humongous". Used to describe                      something extremely large or imp...
MongoDB is a scalable, high-performance,            open source NoSQL database.    - Document Oriented DB    - Written in ...
Features         - Flexible JSON-style documents         - Full Indexing         - Complex Queries / Map Reduce         - ...
Document Oriented Coming from SQL?                            Database => Database                            Table => Col...
JSON-style documents    {         name: {                   first: John,                   last: Doe                  },   ...
No Schema or fixed tables     {         name: {                   first: Foo,                   last: Bar                  }...
Embedded documents   {    "_id" : ObjectId("4ccba15ef597e9352e060000")    "srcFilename" : "/etc/apache2/sites-enabled/exam...
Document Referencing    {    "_id" : ObjectId("4cc4a5c3f597e9db6e010109"),    "billingId" : NumberLong(650),    "created" ...
Full Indexing                 db.coll.ensureIndex({name.last: 1})                 db.coll.ensureIndex({name.first: 1, name....
Querying                      db.coll.find({name: John})                      db.coll.find({keywords: storage})             ...
GridFS                      - Files are divided in chunks                        and stored over multiple documents       ...
Replication                      Source: http://www.mongodb.org/display/DOCS/ReplicationSunday, March 3, 13
Shards                      Source: http://www.mongodb.org/display/DOCS/IntroductionSunday, March 3, 13
Simple Installation/Zero Config                                 OS X        wget http://fastdl.mongodb.org/osx/mongodb-osx-...
Simple Installation/Zero Config                                   CentOS Linux  /etc/yum.repos.d/10gen.repo  [10gen]  name=...
Why is MongoDB good                      for Rapid Development                      of Web Apps?Sunday, March 3, 13
Rapid Development                      Schema-less / Document Oriented                                                  FL...
Rapid Development                      Schema-less / Document Oriented                                                   E...
Rapid Development                                          NO JOINS!Sunday, March 3, 13
Performance                                      SPEED      by xavi talledaSunday, March 3, 13
Performance                                                  SCALABILITY     by Jimee, Jackie, Tom & AshaSunday, March 3, 13
A Word of Caution                                     No Transactions                                      No Rollbacks   ...
Great Use Cases            - Content Management            - Product Catalogs            - Realtime Analytics            -...
andSunday, March 3, 13
PECL driver Linux pecl install mongo echo “extension=mongo.so >> /path/php.ini” OS X http://php-osx.liip.ch/ Windows https...
Attention                            Mongo 1.2.x                      $m = new Mongo();                       Mongo 1.3.x$...
Usage <?php // connect $m = new MongoClient(); // select a database $db = $m->comedy; // select a collection (analogous to...
Storing Files          <?php          // save a file          $id = $grid->storeFile("game.tgz");          $game = $grid->...
SQL to Mongo Queries                      SQL to Mongo Mapping Chart                      This is a PHP-specific version o...
Admin Interfaces          - Genghis            http://genghisapp.com/          - RockMongo            http://code.google.c...
PHP Libraries                      - Doctrine ODM                       Doctrine MongoDB Object Document Mapper is built f...
Doctrine MongoDB ODM                      http://doctrine-project.org    Doctrine MongoDB Object Document Mapper is     bu...
Doctrine MongoDB ODM  /** @Document */  class User  {      /** @Id */      private $id;            /** @String */         ...
Doctrine MongoDB ODM  /** @Document */  class BlogPost  {      /** @Id */      private $id;            /** @String */     ...
Doctrine MongoDB ODM  <?php  // create user  $user = new User();  $user->setName(Bulat S.);  $user->setEmail(email@example...
Doctrine MongoDB ODM    Array    (        [_id] => 4bec5869fdc212081d000000        [title] => My First Blog Post        [b...
Doctrine MongoDB ODM  Array  (      [_id] => 4bec5869fdc212081d010000      [name] => Bulat S.      [email] => email@exampl...
Doctrine MongoDB ODM  Retrieving Persisted Objects  $user = $dm->find(User, $userId);  $user = $dm->getRepository(User)->f...
Doctrine MongoDB ODM  Document Repositories  // src/YourNamespace/YourBundle/ServerRepository.php  namespace YourNamespace...
Doctrine MongoDB ODM  /** @Document */  class Image  {      /** @Id */      private $id;            /** @Field */         ...
Doctrine MongoDB ODM  // store file  $image = new Image();  $image->setName(Test image);  $image->setFile(/path/to/image.p...
Tips: Doctrine MongoDB ODM              // Eager ID creation              public function __construct()              {    ...
Tips: Doctrine MongoDB ODM              // Creation date              public function __construct()              {        ...
Tips: Doctrine MongoDB ODM              // ArrayCollections              public function __construct()              {     ...
Tips: Doctrine MongoDB ODM              // Space Saving                      /** @String(name=”n”) */                     ...
Symfony is a PHP Web Development Framework.Sunday, March 3, 13
“First, Symfony2 is a reusable set of standalone, decoupled,    and cohesive PHP components that solve common web         ...
25 High Quality                       ComponentsSunday, March 3, 13
Symfony 2 Components                      •   DependencyInjection                    •   Serializer                      •...
Symfony 2 Components   Components Documentation   http://symfony.com/doc/current/components/index.html    Blog post series...
Symfony 2 Highlights  •   Rewritten from scratch for PHP 5.3  •   Based on the HTTP specification  •   Very stable and sol...
Symfony 2 Highlights  • Extensible Configuration with Service Container/    Dependency Injection  • Complete redesign of F...
Symfony 2 Highlights: Community    • 698 developers contributed to Symfony2    • 7000+ pull requests    • 969 1901 bundles...
Symfony 2 Highlights: BundlesSunday, March 3, 13
Symfony 2 Getting Startedhttp://symfony.com/downloadSunday, March 3, 13
Symfony 2 Getting Started                      tar zxf Symfony_Standard_Vendors_2.2.0.tgz                                 ...
Symfony 2 Getting Started with Composer              $ curl -s https://getcomposer.org/installer | php              $ php ...
Symfony 2 Getting Started            Distributions                      A Symfony distribution is made up of Symfony2     ...
Symfony 2 Getting Started    Symfony Standard Distribution      • Directory structure      • Default configuration      • B...
Symfony 2 Getting StartedSunday, March 3, 13
Symfony 2 Getting StartedSunday, March 3, 13
Symfony 2 Directory StructureSunday, March 3, 13
Symfony 2 Directory StructureSunday, March 3, 13
Symfony 2 Directory StructureSunday, March 3, 13
Symfony 2 Directory StructureSunday, March 3, 13
Symfony 2 Configuration: app/config.ymlSunday, March 3, 13
Symfony 2     Configuration: app/parameters.iniSunday, March 3, 13
Symfony 2     Configuration: app/config_dev.ymlSunday, March 3, 13
Browser                        Request       Bootstrap (app.php)                      Controller                       Tem...
Bootstrap (app.php)Sunday, March 3, 13
Symfony 2 Bootstrap File - web/app.phpSunday, March 3, 13
ControllersSunday, March 3, 13
Symfony 2 ControllersSunday, March 3, 13
ControllersSunday, March 3, 13
Sunday, March 3, 13
TemplatesSunday, March 3, 13
Symfony 2 Templating / Twig                      Comments: {# comments are not rendered #}                                ...
Symfony 2 Templating / Twig  Blocks: {% set var = ‘hello’ %}          {% set foo = var ~ ’ and goodbye’ %}                ...
Symfony 2 Templating / Twig  Blocks: {% for key, val in list %}                         {{ loop.index }}. {{ val }}       ...
Symfony 2 Templating / TwigExtends:                      {% extends "Bundle::layout.html.twig" %} Include:                ...
Awesome Twig Presentations  Twig, The Flexible, Fast and Secure Template Language  for PHP - Fabien Potencier  http://www....
Symfony 2 layout.html.twigSunday, March 3, 13
Symfony 2 index.html.twigSunday, March 3, 13
Symfony 2 index.html.twigSunday, March 3, 13
BundlesSunday, March 3, 13
Symfony 2 Bundles                      Everything in Symfony2 is                        contained in BundlesSunday, March ...
Symfony 2 Bundles                         Even Symfony2 is                      a collection of BundlesSunday, March 3, 13
Symfony 2 Directory StructureSunday, March 3, 13
Symfony 2 Bundles Registration            app/AppKernel.phpSunday, March 3, 13
Symfony 2 Bundles for MongoDB                      - DoctrineMongoDBBundle                      - MandangoBundleSunday, Ma...
Symfony 2     Installing DoctrineMongoDBBundle               Installation with Composer               composer.json       ...
Symfony 2     Installing DoctrineMongoDBBundle               Installation with Composer                  $ php composer.ph...
Symfony 2   Configuring DoctrineMongoDBBundle  app/autoload.php // app/autoload.php use DoctrineODMMongoDBMappingDriverAnno...
Symfony 2   Configuring DoctrineMongoDBBundle app/config/config.yml doctrine_mongodb:     connections:         default:      ...
Symfony 2   Multiple Connections & Bundle Mappings doctrine_mongodb:     connections:         default:             server:...
Symfony 2 Defining DocumentsSunday, March 3, 13
Symfony 2 Defining Documents // src/Acme/StoreBundle/Document/Product.php namespace AcmeStoreBundleDocument; use DoctrineOD...
Symfony 2 Using Documents // src/Acme/StoreBundle/Controller/DefaultController.php use AcmeStoreBundleDocumentProduct; use...
Symfony 2 Forms        Since Documents are Plain PHP Objects integrating it with Symfony Forms is straightforward.   publi...
Symfony 2 ODM Commands Symfony2 Commands doctrine   doctrine:mongodb:cache:clear-metadata    Clear all metadata cache for ...
TIP: Storing Symfony Sessions in MongoDB  app/config/config.ymlSunday, March 3, 13
TIP: Mixing Doctrine ODM & ORM                         Order             Product                      Entity (ORM)     Doc...
TIP: Persisting objects with ODM or ORM <?php namespace DoctrineBlog; /** @Entity(repositoryClass="DoctrineBlogORMBlogPost...
TIP: Persisting objects with ODM or ORM <?php namespace Documents; /** @Document(repositoryClass="DoctrineBlogODMMongoDB B...
Symfony 2 Bundles using MongoDB               - SonataDoctrineMongoDBAdminBundle               - IsmaAmbrosiGeneratorBundl...
Additional Resources       - http://php.net/mongo       - http://docs.mongodb.org/manual/       - http://symfony.com/doc/c...
Questions?Sunday, March 3, 13
Thank you!                 Rate Me Please! https://joind.in/8211                      Slides: http://slideshare.net/pgodel...
Upcoming SlideShare
Loading in...5
×

Symfony2 and MongoDB - MidwestPHP 2013

6,526

Published on

In this talk we will 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
6 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
6,526
On Slideshare
0
From Embeds
0
Number of Embeds
4
Actions
Shares
0
Downloads
62
Comments
0
Likes
6
Embeds 0
No embeds

No notes for slide

Transcript of "Symfony2 and MongoDB - MidwestPHP 2013 "

  1. 1. Pablo Godel @pgodel - MidwestPHP 2013 March 2nd 2013 - St. Paul, MN https://joind.in/8211Sunday, March 3, 13
  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 parrillaSunday, March 3, 13
  3. 3. Sunday, March 3, 13
  4. 4. Sunday, March 3, 13
  5. 5. ServerGrove! ⁃ Founded ServerGrove Networks in 2005 ⁃ Provider of web hosting specialized in PHP, Symfony, ZendFramework, and others ⁃ Mongohosting.com! ⁃ Servers in Miami, FL and Dublin, IrelandSunday, March 3, 13
  6. 6. Community is our teacher ⁃ Very active open source supporter through code contributions and usergroups/conference sponsoringSunday, March 3, 13
  7. 7. Agenda - Introduction to MongoDB - PHP and MongoDB - PHP Libraries - Introduction to Symfony2 - Symfony2 and MongoDBSunday, March 3, 13
  8. 8. What is MongoDB? Who is 10Gen?Sunday, March 3, 13
  9. 9. Mongo Mongo as in "humongous". Used to describe something extremely large or important.Sunday, March 3, 13
  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...)Sunday, March 3, 13
  11. 11. Features - Flexible JSON-style documents - Full Indexing - Complex Queries / Map Reduce - Aggregation Framework - GridFS (store files natively) - Multiple Replication Options - Sharding - Simple Installation / Zero ConfigSunday, March 3, 13
  12. 12. Document Oriented Coming from SQL? Database => Database Table => Collection Row => DocumentSunday, March 3, 13
  13. 13. JSON-style documents { name: { first: John, last: Doe }, title: Engineer, age: 40 }Sunday, March 3, 13
  14. 14. No Schema or fixed tables { name: { first: Foo, last: Bar }, title: Student, school: Harvard }Sunday, March 3, 13
  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" } ] } }Sunday, March 3, 13
  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") } ] }Sunday, March 3, 13
  17. 17. Full Indexing db.coll.ensureIndex({name.last: 1}) db.coll.ensureIndex({name.first: 1, name.last: 1}) db.coll.ensureIndex({age: 0})Sunday, March 3, 13
  18. 18. Querying db.coll.find({name: John}) db.coll.find({keywords: storage}) db.coll.find({keywords: {$in: [storage, DBMS]}}Sunday, March 3, 13
  19. 19. GridFS - Files are divided in chunks and stored over multiple documents - Transparent API $grid->storeFile("/path/to/somefile.txt",  array("metadata" => array("date" => new MongoDate())));Sunday, March 3, 13
  20. 20. Replication Source: http://www.mongodb.org/display/DOCS/ReplicationSunday, March 3, 13
  21. 21. Shards Source: http://www.mongodb.org/display/DOCS/IntroductionSunday, March 3, 13
  22. 22. Simple Installation/Zero Config OS X wget http://fastdl.mongodb.org/osx/mongodb-osx-x86_64-2.2.3.tgz tar zxvf mongodb-osx-x86_64-2.2.3.tgz cd mongodb-osx-x86_64-2.2.3 ./mongodSunday, March 3, 13
  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-10gen-server $ service mongod startSunday, March 3, 13
  24. 24. Why is MongoDB good for Rapid Development of Web Apps?Sunday, March 3, 13
  25. 25. Rapid Development Schema-less / Document Oriented FLEXIBILITY by exfordySunday, March 3, 13
  26. 26. Rapid Development Schema-less / Document Oriented EASIER MIGRATIONS by exfordySunday, March 3, 13
  27. 27. Rapid Development NO JOINS!Sunday, March 3, 13
  28. 28. Performance SPEED by xavi talledaSunday, March 3, 13
  29. 29. Performance SCALABILITY by Jimee, Jackie, Tom & AshaSunday, March 3, 13
  30. 30. A Word of Caution No Transactions No Rollbacks Unsafe defaults Map Reduce locks by Ernst VikneSunday, March 3, 13
  31. 31. Great Use Cases - Content Management - Product Catalogs - Realtime Analytics - Logs StorageSunday, March 3, 13
  32. 32. andSunday, March 3, 13
  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/downloadsSunday, March 3, 13
  34. 34. Attention Mongo 1.2.x $m = new Mongo(); Mongo 1.3.x$m = new MongoClient();Sunday, March 3, 13
  35. 35. Usage <?php // connect $m = new MongoClient(); // 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 Watte rson" ); $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"; } ?>Sunday, March 3, 13
  36. 36. 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))); ?>Sunday, March 3, 13
  37. 37. 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.phpSunday, March 3, 13
  38. 38. 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-adminSunday, March 3, 13
  39. 39. PHP Libraries - Doctrine ODM Doctrine MongoDB Object Document Mapper is built for PHP 5.3.2+ and provides transparent persistence for PHP objects. - Mandango Mandango is a simple, poweful and ultrafast Object Document Mapper (ODM) for PHP and MongoDB. - many more...Sunday, March 3, 13
  40. 40. 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.Sunday, March 3, 13
  41. 41. Doctrine MongoDB ODM /** @Document */ class User { /** @Id */ private $id; /** @String */ private $name; /** @String */ private $email; /** @ReferenceMany(targetDocument="BlogPost", cascade="all") */ private $posts; // ... }Sunday, March 3, 13
  42. 42. Doctrine MongoDB ODM /** @Document */ class BlogPost { /** @Id */ private $id; /** @String */ private $title; /** @String */ private $body; /** @Date */ private $createdAt; // ... }Sunday, March 3, 13
  43. 43. 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();Sunday, March 3, 13
  44. 44. Doctrine MongoDB ODM Array ( [_id] => 4bec5869fdc212081d000000 [title] => My First Blog Post [body] => MongoDB + Doctrine 2 ODM = awesomeness! [createdAt] => MongoDate Object ( [sec] => 1273723200 [usec] => 0 ) )Sunday, March 3, 13
  45. 45. 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 ) ) )Sunday, March 3, 13
  46. 46. Doctrine MongoDB ODM Retrieving Persisted Objects $user = $dm->find(User, $userId); $user = $dm->getRepository(User)->findOneByName(Bulat S.); $posts = $user->getPosts(); foreach ($posts as $post) { echo $post; }Sunday, March 3, 13
  47. 47. 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();Sunday, March 3, 13
  48. 48. Doctrine MongoDB ODM /** @Document */ class Image { /** @Id */ private $id; /** @Field */ private $name; /** @File */ private $file;Sunday, March 3, 13
  49. 49. 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();Sunday, March 3, 13
  50. 50. Tips: Doctrine MongoDB ODM // Eager ID creation public function __construct() { $this->id = (string) new MongoId(); }Sunday, March 3, 13
  51. 51. Tips: Doctrine MongoDB ODM // Creation date public function __construct() { $this->id = (string) new MongoId(); $this->createdDt = new DateTime(); }Sunday, March 3, 13
  52. 52. Tips: Doctrine MongoDB ODM // ArrayCollections public function __construct() { $this->id = (string) new MongoId(); $this->createdDt = new DateTime(); $this->entries = new ArrayCollection(); }Sunday, March 3, 13
  53. 53. Tips: Doctrine MongoDB ODM // Space Saving /** @String(name=”n”) */ private $name; /** @String(name=”e”) */ private $email;Sunday, March 3, 13
  54. 54. Symfony is a PHP Web Development Framework.Sunday, March 3, 13
  55. 55. “First, Symfony2 is a reusable set of standalone, decoupled, and cohesive PHP components that solve common web development problems. Then, based on these components, Symfony2 is also a full-stack web framework.” http://fabien.potencier.org/article/49/what-is-symfony2Sunday, March 3, 13
  56. 56. 25 High Quality ComponentsSunday, March 3, 13
  57. 57. Symfony 2 Components • DependencyInjection • Serializer • EventDispatcher • Validator • HttpFoundation • Security • DomCrawler • Routing • ClassLoader • Console • CssSelector • Process • HttpKernel • Config • BrowserKit • Finder • Templating • Locale • Translation • Yaml • Serializer • Form • More... All of them at GitHub: http://github.com/symfonySunday, March 3, 13
  58. 58. Symfony 2 Components Components Documentation http://symfony.com/doc/current/components/index.html Blog post series about creating a framework based on the Symfony2 Components http://fabien.potencier.org/Sunday, March 3, 13
  59. 59. Symfony 2 Highlights • Rewritten from scratch for PHP 5.3 • Based on the HTTP specification • Very stable and solid API • Extensible through the creation of Bundles (replacement for sf1 plugins) • Flexible configuration using YAML, XML, annotations or PHP • All configuration is compiled to PHP code and cached • Lots of unit tests • Source code audited by independent security firm thanks to donations of the Symfony CommunitySunday, March 3, 13
  60. 60. Symfony 2 Highlights • Extensible Configuration with Service Container/ Dependency Injection • Complete redesign of Forms support • Validations • Extensible Security with Authentication/Authorization • Advanced and powerful templating through Twig • Routes configured with YAML, XML or Annotations • ESI Caching support out of the box • Assets management with Assetic • Translations • EnvironmentsSunday, March 3, 13
  61. 61. Symfony 2 Highlights: Community • 698 developers contributed to Symfony2 • 7000+ pull requests • 969 1901 bundles at knpbundles.com • Very active IRC and mailing lists support channels • Community Gamification through SensioLabs Connect • Symfony2 EcosystemSunday, March 3, 13
  62. 62. Symfony 2 Highlights: BundlesSunday, March 3, 13
  63. 63. Symfony 2 Getting Startedhttp://symfony.com/downloadSunday, March 3, 13
  64. 64. Symfony 2 Getting Started tar zxf Symfony_Standard_Vendors_2.2.0.tgz or unzip Symfony_Standard_Vendors_2.2.0.zipSunday, March 3, 13
  65. 65. Symfony 2 Getting Started with Composer $ curl -s https://getcomposer.org/installer | php $ php composer.phar create-project symfony/framework-standard-edition path/ 2.2.0 http://getcomposer.org/Sunday, March 3, 13
  66. 66. Symfony 2 Getting Started Distributions A Symfony distribution is made up of Symfony2 components, a selection of bundles, a directory structure, a default configuration. http://symfony.com/distributionsSunday, March 3, 13
  67. 67. Symfony 2 Getting Started Symfony Standard Distribution • Directory structure • Default configuration • Bundles ⁃ DoctrineBundle ⁃ JMSSecurityExtraBundle ⁃ SensioDistributionBundle ⁃ SensioFrameworkExtraBundle ⁃ SensioGeneratorBundle ⁃ AsseticBundle http://symfony.com/distributionsSunday, March 3, 13
  68. 68. Symfony 2 Getting StartedSunday, March 3, 13
  69. 69. Symfony 2 Getting StartedSunday, March 3, 13
  70. 70. Symfony 2 Directory StructureSunday, March 3, 13
  71. 71. Symfony 2 Directory StructureSunday, March 3, 13
  72. 72. Symfony 2 Directory StructureSunday, March 3, 13
  73. 73. Symfony 2 Directory StructureSunday, March 3, 13
  74. 74. Symfony 2 Configuration: app/config.ymlSunday, March 3, 13
  75. 75. Symfony 2 Configuration: app/parameters.iniSunday, March 3, 13
  76. 76. Symfony 2 Configuration: app/config_dev.ymlSunday, March 3, 13
  77. 77. Browser Request Bootstrap (app.php) Controller Template Response Want to know more? Go to Raul Fraile’s Symfony2 Internals TalkSunday, March 3, 13
  78. 78. Bootstrap (app.php)Sunday, March 3, 13
  79. 79. Symfony 2 Bootstrap File - web/app.phpSunday, March 3, 13
  80. 80. ControllersSunday, March 3, 13
  81. 81. Symfony 2 ControllersSunday, March 3, 13
  82. 82. ControllersSunday, March 3, 13
  83. 83. Sunday, March 3, 13
  84. 84. TemplatesSunday, March 3, 13
  85. 85. Symfony 2 Templating / Twig Comments: {# comments are not rendered #} {# multi-line comments! {{ var }} #} Output variables: {{ var }} {{ var | upper }} {{ var | raw }} {{ object.property }} {{ true ? ‘yes’ : ‘no’ }} http://twig.sensiolabs.org/Sunday, March 3, 13
  86. 86. Symfony 2 Templating / Twig Blocks: {% set var = ‘hello’ %} {% set foo = var ~ ’ and goodbye’ %} {% if foo is ‘bar’ %} ... {% else %} ... {% endif %} http://twig.sensiolabs.org/Sunday, March 3, 13
  87. 87. Symfony 2 Templating / Twig Blocks: {% for key, val in list %} {{ loop.index }}. {{ val }} {% else %} No keys. {% endfor %} http://twig.sensiolabs.org/Sunday, March 3, 13
  88. 88. Symfony 2 Templating / TwigExtends: {% extends "Bundle::layout.html.twig" %} Include: {% include “Bundle:Demo:template.html.twig” %} Render: {% render “Bundle:Demo:action” %} http://twig.sensiolabs.org/Sunday, March 3, 13
  89. 89. Awesome Twig Presentations Twig, The Flexible, Fast and Secure Template Language for PHP - Fabien Potencier http://www.slideshare.net/fabpot/twig-the-flexible-fast-and-securetemplate- language-for-php Being Dangerous with Twig - Ryan Weaver http://slideshare.net/weaverryan/being-dangerous-with-twig-symfony- live-paris Twig avanzado - Javier Eguiluz http://www.slideshare.net/javier.eguiluz/twig-avanzado-sf2vigo (Spanish)Sunday, March 3, 13
  90. 90. Symfony 2 layout.html.twigSunday, March 3, 13
  91. 91. Symfony 2 index.html.twigSunday, March 3, 13
  92. 92. Symfony 2 index.html.twigSunday, March 3, 13
  93. 93. BundlesSunday, March 3, 13
  94. 94. Symfony 2 Bundles Everything in Symfony2 is contained in BundlesSunday, March 3, 13
  95. 95. Symfony 2 Bundles Even Symfony2 is a collection of BundlesSunday, March 3, 13
  96. 96. Symfony 2 Directory StructureSunday, March 3, 13
  97. 97. Symfony 2 Bundles Registration app/AppKernel.phpSunday, March 3, 13
  98. 98. Symfony 2 Bundles for MongoDB - DoctrineMongoDBBundle - MandangoBundleSunday, March 3, 13
  99. 99. Symfony 2 Installing DoctrineMongoDBBundle Installation with Composer composer.json { require": { "doctrine/mongodb-odm-bundle": "3.0.*" }, "minimum-stability": "dev" } $ php composer.phar update $ php composer.phar install doctrine/mongodb-odm-bundleSunday, March 3, 13
  100. 100. Symfony 2 Installing DoctrineMongoDBBundle Installation with Composer $ php composer.phar require doctrine/mongodb-odm-bundle:3.0.*Sunday, March 3, 13
  101. 101. Symfony 2 Configuring DoctrineMongoDBBundle app/autoload.php // app/autoload.php use DoctrineODMMongoDBMappingDriverAnnotationDriver; AnnotationDriver::registerAnnotationClasses();Sunday, March 3, 13
  102. 102. Symfony 2 Configuring DoctrineMongoDBBundle app/config/config.yml doctrine_mongodb: connections: default: server: mongodb://localhost:27017 options: connect: true default_database: test_database document_managers: default: auto_mapping: trueSunday, March 3, 13
  103. 103. Symfony 2 Multiple Connections & Bundle Mappings 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 }Sunday, March 3, 13
  104. 104. Symfony 2 Defining DocumentsSunday, March 3, 13
  105. 105. Symfony 2 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;Sunday, March 3, 13
  106. 106. Symfony 2 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_mongodb)->getManager(); $dm->persist($product); $dm->flush(); return new Response(Created product id .$product->getId()); }Sunday, March 3, 13
  107. 107. Symfony 2 Forms Since Documents are Plain PHP Objects integrating it with Symfony Forms is straightforward. public function createAction() { $dm = $this->get(doctrine_mongodb)->getManager(); $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.htmlSunday, March 3, 13
  108. 108. Symfony 2 ODM 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 documentsSunday, March 3, 13
  109. 109. TIP: Storing Symfony Sessions in MongoDB app/config/config.ymlSunday, March 3, 13
  110. 110. TIP: Mixing Doctrine ODM & ORM Order Product Entity (ORM) Document (ODM) http://docs.doctrine-project.org/projects/doctrine- mongodb-odm/en/latest/cookbook/blending-orm-and- mongodb-odm.htmlSunday, March 3, 13
  111. 111. TIP: Persisting objects with ODM or ORM <?php namespace DoctrineBlog; /** @Entity(repositoryClass="DoctrineBlogORMBlogPostRepository") */ class BlogPost { /** @Id @Column(type="integer") */ private $id; /** @Column(type="string") */ private $title; /** @Column(type="text") */ private $body; // ... }Sunday, March 3, 13
  112. 112. TIP: Persisting objects with ODM or ORM <?php namespace Documents; /** @Document(repositoryClass="DoctrineBlogODMMongoDB BlogPostRepository") */ class BlogPost { /** @Id */ private $id; /** @Field(type="string") */ private $title; /** @Field(type="string") */ private $body; // ... }Sunday, March 3, 13
  113. 113. Symfony 2 Bundles using MongoDB - SonataDoctrineMongoDBAdminBundle - IsmaAmbrosiGeneratorBundle - TranslationEditorBundle - ServerGroveLiveChatSunday, March 3, 13
  114. 114. Additional Resources - http://php.net/mongo - http://docs.mongodb.org/manual/ - http://symfony.com/doc/current/index.html - http://www.doctrine-project.org/docs/mongodb-odmSunday, March 3, 13
  115. 115. Questions?Sunday, March 3, 13
  116. 116. Thank you! Rate Me Please! https://joind.in/8211 Slides: http://slideshare.net/pgodel Twitter: @pgodel E-mail: pablo@servergrove.comSunday, March 3, 13
  1. A particular slide catching your eye?

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

×