2. François Zaninotto Head of the Web Development Team at eTF1, editor the web properties of the leading TV network in France. Former symfony 1 contributor Author of “The Definitive Guide to Symfony” (APress) Lead Developer of Propel since October, 2009 Interests: Web development, Usability, Agility, ROI Not a developer Twitter: @francoisz, Github: fzaninotto
4. No surprise Backwards compatible with Propel 1.3 and 1.4 Faster than Propel 1.4, which was faster than Propel 1.3, which was... Very IDE friendly Better documented More robust (3 times as many unit tests as Propel 1.3) Fully integrated into symfony 1.3/1.4 (sfPropel15Plugin)
5. Surprise! Major new features Model Queries Collections Many-to-many relationships Major new behaviors Nested Sets Concrete Table Inheritance Better Oracle Support
6. Surprise! Major new features Model Queries Collections Many-to-many relationships Major new behaviors Nested Sets Concrete Table Inheritance Better Oracle Support Killer Feature Killer Feature
7. Model Queries Model Queries are to the SQL query what ActiveRecord is to the table row Shift from the relational Paradigm to the Object paradigm in Queries Inspirations: SQL Alchemy, Doctrine, DbFinder, Arel Code generation makes it fast and IDE friendly Easy to learn and use MUCH cleaner custom model code Bye bye, Criteria!
9. Concrete Table Inheritance content id title article body video url structure data
10. Concrete Table Inheritance: An Example $article = new Article(); $article->setTitle(‘France loses World Cup’); $article->setBody(‘Lorem Ipsum’); $article->save(); $video = new Video(); $video->setTitle(‘World Cup Goals’); $video->setUrl(‘http://www.youtube.com/xxx’); $video->save();
11. > SELECT * FROMarticle; +----+------------------------+-------------+ | id | title | body | +----+------------------------+-------------+ | 1 | France loses World Cup | Lorem Ipsum | +----+------------------------+-------------+ > SELECT * FROMvideo; +----+-----------------+----------------------------+ | id | title | url | +----+-----------------+----------------------------+ | 2 | World Cup goals | http://www.youtube.com/xxx | +----+-----------------+----------------------------+ > SELECT * FROM content; +----+------------------------+ | id | title | +----+------------------------+ | 1 | France loses World Cup | | 2 | World Cup goals | +----+------------------------+
12. Design your model in a true object-oriented way Let Propel do the mapping with the relational world Denormalize with ease for optimal performance Let PHP manipulate inheritance, not data replication. … Let PHP manipulate objects, not records. … Let PHP manipulate collections, not arrays. … Let PHP manipulate relations, not foreign keys.
14. Continuous improvements through minor versions 1.5.1 PropelObjectCollection::toKeyValue() One-to-many joined hydration (no LIMIT support) CLI enhancements 1.5.2 Namespaces ! ModelQuery::findOneOrCreate() aggregate_column behavior SQL Comments Must Have Killer Feature
15. Namespaces // in schema.xml <table name="book"namespace="Bookstore"> ... </table> // in application code useBookstoreookQuery; $book = BookQuery::create(); ->findOneByTitle(‘War And Peace’); echoget_class($book); // Bookstoreook $author = $book->getAuthor(); echoget_class($author); // Bookstoreeopleuthor
16. Aggregate Table Behavior author id name book id title author_id * <table name="author"> <behavior name="aggregate_column"> <parameter name="name" value="nb_books" /> <parameter name="foreign_table" value="book" /> <parameter name="expression" value="COUNT(id)" /> </behavior> ... </table>
17. Aggregate Table Behavior author id name nb_books book id title author_id * <table name="author"> <behavior name="aggregate_column"> <parameter name="name" value="nb_books" /> <parameter name="foreign_table" value="book" /> <parameter name="expression" value="COUNT(id)" /> </behavior> ... </table>
23. Many of the symfony add-ons to Propel are now part of Propel 1.5 Model hooks, query hooks Behavior system (at buildtime, for better performance and power) auto_add_pkbehavior timestampable behavior isPrimaryString column attribute for automated __toString() No need for custom symfony code for these
24. Why you may want to use Propel rather than Doctrine 2 No need to upgrade your Model code It’s fast (without any cache system - that’s code generation) It’s an ActiveRecord implementation It has behaviors It’s IDE friendly The model code is easy to understand and debug It has unique features (ModelQueries, concrete table inheritance, aggregate column behavior, etc.) It’s robust (3000+ unit tests) and already used by many developers It’s not alpha, it’s not beta, it’s already stable
26. The PropelBundle is bundled with the Symfony2 Framework Register the bundle in the kernel // in hello/HelloKernel.php classHelloKernelextendsKernel { public functionregisterBundles() { $bundles = array( ... new SymfonyrameworkropelBundleundle(), ); return $bundles; } }
27. Add Propel and Phing libraries in src/vendor/ > cd src/vendor > svn co http://svn.propelorm.org/branches/1.5/ propel > svn co http://svn.phing.info/tags/2.3.3 phing Add Propel and Phing paths to the project configuration # in hello/config/config.yml propel.config: path: %kernel.root_dir%/../src/vendor/propel phing_path: %kernel.root_dir%/../src/vendor/phing
28. Test the installation by calling the project console > hello/console Symfony version 2.0.0-DEV - hello Usage: [options] command [arguments] propel :build Hub for Propel build commands (model, sql) :build-model Build the Propel Object Model classes based on XML schemas :build-sql Build the SQL generation code for all tables based on Propel XML schemas
32. Build the model and SQL code > cd sandbox > hello/console propel:build src/Application/HelloBundle/ Model/ map/ om/ Author.php AuthorPeer.php AuthorQuery.php Book.php BookPeer.php BookQuery.php hello/propel/sql/ HelloBundle-schema.sql
33. // in sandbox/src/application/HelloBundle/Model/Book.php namespaceApplicationelloBundleodel; useApplicationelloBundleodelmaseBook; /** * Skeleton subclass for representing a row from the * 'book' table. * * You should add additional methods to this class to meet * the application requirements. This class will only be * generated as long as it does not already exist in the * output directory. */ classBookextendsBaseBook { } // Book
34. Setup your connection in the project configuration # in sandbox/hello/config/config.yml propel.dbal: driver: mysql user: root password: null dsn: mysql:host=localhost;dbname=test options: {}
35. Use models in your actions as with Propel 1.5 alone Symfony handles the autoloading // in sandbox/src/Application/HelloBundle/Controller/HelloController.php namespaceApplicationelloBundleontroller; useSymfonyrameworkebBundleontroller; useApplicationelloBundleodeluthorQuery; classHelloControllerextendsController { public functionindexAction($name) { $author = AuthorQuery::create() ->findOneByName($name); return $this->render('HelloBundle:Hello:index', array('author' => $author)); } }
36. That’s about it All the Propel features are ready to use… in the Propel way
39. A lot left to do YAML format for the schema (and bundle override) Web Debug Toolbar Panel Form integration (Widgets, Validators, Model forms) Admin Generator Theme Documentation Unit tests
40. And even more Embedded Relation Forms Admin generator on steroids Easy Custom Filter Cross-module links Plain text fields Advanced Object Routing Collection routes Nested routes A thousand more ideas worth implementing cf. sfPropel15Plugin cf. DbFinderPlugin
41. Not much time to do so I’m already developing Propel I’m already developing sfPropel15Plugin I also have a full-time job …and a family Any help is welcome!
42. Questions? Online Resources http://github.com/fzaninotto/symfony http://www.propelorm.org/ http://www.symfony-project.org/plugins/sfPropel15Plugin News about all that http://propel.posterous.com/ http://twitter.com/francoisz