symfony: An Open-Source Framework for Professionals (PHP Day 2008)

4,857 views
4,784 views

Published on

Published in: Technology, Education
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
4,857
On SlideShare
0
From Embeds
0
Number of Embeds
13
Actions
Shares
0
Downloads
70
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

symfony: An Open-Source Framework for Professionals (PHP Day 2008)

  1. 1. symfony An Open-Source Framework for Professionals Fabien Potencier www.sensiolabs.com
  2. 2. Before we begin How many have already used symfony for a project, even a very small personal project? www.sensiolabs.com
  3. 3. Before we begin Do you want to do the exercices on your laptop? www.sensiolabs.com
  4. 4. Sensio • Sensio Sensio Web Agency – Web Agency Internet Webmarketing – Founded in 1998 Technologies – 45 people dedicated to Web dev. • Open-Source Specialists symfony framework creator • Big corporate customers www.sensiolabs.com
  5. 5. symfony • PHP Web framework • Based on – 10 years of Sensio experience – Existing Open-Source projects • Built for : – Professional websites – Complex needs – Demanding environments www.sensiolabs.com
  6. 6. Framework www.sensiolabs.com
  7. 7. Whatever the application, a framework is build to ease development by providing tools for recurrent and boring tasks. www.sensiolabs.com
  8. 8. Maintainability & Evolutivity www.sensiolabs.com
  9. 9. Structure & Standardisation www.sensiolabs.com
  10. 10. MVC www.sensiolabs.com
  11. 11. Model www.sensiolabs.com
  12. 12. View www.sensiolabs.com
  13. 13. Controller www.sensiolabs.com
  14. 14. 1 Internet 2 Controleur 6 3 5 Modèle Vue 4 BDD www.sensiolabs.com
  15. 15. Develop Faster & Better www.sensiolabs.com
  16. 16. Write less code less code  less complexity  less bugs  more productivity  more time More time for edge cases, business rules, … www.sensiolabs.com
  17. 17. Each line of code has an initial cost Costinitial = Costdeveloppement + Costtests … and there is a cost to maintain the line Costmaintenance >> Costinitial Costmaintenance = Costunderstanding + Costchange + Costtests + Costdeployment Kent Beck (based on Yourdon and Constantine) www.sensiolabs.com
  18. 18. symfony www.sensiolabs.com
  19. 19. An Open-Source Framework www.sensiolabs.com
  20. 20. MIT Licence « It is a permissive license, meaning that it permits reuse within proprietary software on the condition that the license is distributed with that software. » www.sensiolabs.com
  21. 21. An Open-Source Documentation www.sensiolabs.com
  22. 22. •  Open-Source documentation –  The book (450 pages - GFDL) –  Askeet Tutorial (250 pages) •  Translation in 12 langages –  (Chinese) – Polski –  Deutsch – Português –  Español – Russian –  Français – Ukrainian –  Italiano –  Čeština –  (Japanese) – Nederlands www.sensiolabs.com
  23. 23. www.sensiolabs.com
  24. 24. A great Community www.sensiolabs.com
  25. 25. Mailing-list support / forums / IRC 240 available plugins 300k unique visitors per month on the official website www.symfony-project.org www.sensiolabs.com
  26. 26. « Entreprise » Version www.sensiolabs.com
  27. 27. Version 1.0 released early 2007 Maintained for 3 ans (early 2010) ~1 release a month (1.0.16 now) Bugs and security fixes, compatibility with upcoming PHP versions No new features Upgrading is simple and safe www.sensiolabs.com
  28. 28. Let’s start a Project www.sensiolabs.com
  29. 29. The Project • A simple blog system – Posts – Categories – Authors – Comments • Requirements – Maintainable – Customizable – Secure • Use symfony 1.1 www.sensiolabs.com
  30. 30. List of recent posts Excerpt Categories Post information www.sensiolabs.com
  31. 31. Sidebar customization List of comments www.sensiolabs.com Add a comment
  32. 32. YUI stylesheets homepage Famfamfam icons post http://www.symfony-project.org/get/design.tgz www.sensiolabs.com
  33. 33. Project Initialization www.sensiolabs.com
  34. 34. Bootstrap a symfony Project 1.  Install symfony 2.  Initialize a new project 3.  Configure the Web Server 4.  Start coding www.sensiolabs.com
  35. 35. Installing symfony Sandbox: Ready-to-run symfony application PEAR: Install symfony globally on your machine Subversion: Be free to have several versions around www.sensiolabs.com
  36. 36. symfony CLI $ symfony www.sensiolabs.com
  37. 37. Create a new Project $ mkdir blog $ cd blog $ symfony generate:project blog www.sensiolabs.com
  38. 38. Create a new Application ./symfony help generate:app www.sensiolabs.com
  39. 39. Create a new secure Application ./symfony generate:app frontend --escaping-strategy=on --csrf-secret=A$ecret www.sensiolabs.com
  40. 40. Project, Application, Module, Action www.sensiolabs.com
  41. 41. Which symfony Version? ./symfony -V config/ProjectConfiguration.class.php www.sensiolabs.com
  42. 42. Configure the Web Server <VirtualHost *:80> ServerName myapp.example.com DocumentRoot "/path/to/blog/web" DirectoryIndex index.php <Directory "/path/to/blog/web"> AllowOverride All Allow from All Web root directory is web/ </Directory> </VirtualHost> www.sensiolabs.com
  43. 43. symfony Assets Used by the default pages and the Web Debug Toolbar Configure the Web Server to serve symfony assets <VirtualHost *:80> … Alias /sf /$sf_symfony_data_dir/web/sf <Directory "/$sf_symfony_data_dir/web/sf"> AllowOverride All Allow from All </Directory> </VirtualHost> Or, create a symlink $ cd web/ $ ln -sf ../lib/vendor/symfony/data/web/sf sf www.sensiolabs.com
  44. 44. Environments www.sensiolabs.com
  45. 45. developers customers end users development staging production environment environment environment www.sensiolabs.com
  46. 46. cache cache cache debug debug debug logs logs logs stats stats stats development staging production environment environment environment www.sensiolabs.com
  47. 47. Try a 404 dev environment prod environment www.sensiolabs.com
  48. 48. Front Controllers dev environment environment prod environment environment www.sensiolabs.com
  49. 49. Environment Configuration apps/frontend/config/settings.yml environment Web debug toolbar www.sensiolabs.com
  50. 50. Web Debug Toolbar Web debug toolbar www.sensiolabs.com
  51. 51. Create a Module for Posts Create a new ‘post’ module in the ‘frontend’ application $ php symfony generate:module frontend post www.sensiolabs.com
  52. 52. Project, Application, Module, Action www.sensiolabs.com
  53. 53. Action and Template Naming /frontend_dev.php/blog/index module action // in apps/frontend/modules/blog/actions/actions.class.php <?php class blogActions extends sfActions { public function executeIndex() { // do things } } // in apps/frontend/modules/blog/templates/indexSuccess.php <!–- do things --> www.sensiolabs.com
  54. 54. Browse /frontend_dev.php/post/index www.sensiolabs.com
  55. 55. Create the Blog Homepage apps/frontend/modules/post/templates/indexSuccess.php • Copy homepage.html into indexSuccess.php • Copy the images/ and css/ under web/ • Add the base.css CSS in view.yml • Fix images and css paths /frontend_dev.php/post/index www.sensiolabs.com
  56. 56. Create an Action to show a Post apps/frontend/modules/post/actions/actions.class.php • Create an empy executeShow() action • Copy post.html into showSuccess.php • Fix images and css paths /frontend_dev.php/post/show www.sensiolabs.com
  57. 57. Project, Application, Module, Action www.sensiolabs.com
  58. 58. Extract common Code Post page specific content Homepage specific content www.sensiolabs.com
  59. 59. The Layout A layout wraps the template content header.php page content include decoration page content include footer.php layout.php www.sensiolabs.com
  60. 60. The Layout Move the common code from homepage and post to the layout apps/frontend/templates/layout.php www.sensiolabs.com
  61. 61. Customize the Sidebar and the Title The title depends on the page The sidebar depends on the page www.sensiolabs.com
  62. 62. Layout with Several "holes" A slot content depends on the template context Slot1 Main content Slot 2 Main + = content Slot 1 Slot 2 Layout Template Rendered with slots Page www.sensiolabs.com
  63. 63. Create Slots for Title and Sidebar apps/frontend/templates/layout.php www.sensiolabs.com
  64. 64. Fill the Slots apps/frontend/modules/blog/templates/showSuccess.php www.sensiolabs.com
  65. 65. Passing Data from Action to Template apps/frontend/modules/blog/actions/actions.class.php apps/frontend/modules/blog/templates/indexSuccess.php www.sensiolabs.com
  66. 66. Make the Counter dynamic www.sensiolabs.com
  67. 67. Database Schema A post has an author A post can be in a category A post can have comments www.sensiolabs.com
  68. 68. Propel : The symfony ORM ORM = Object-Relational Mapping Mapping a relational database to an object-oriented model Database Abstraction Relational Object-Oriented table class row, record object field, column proterty www.sensiolabs.com
  69. 69. Schema Conventions post: id: # primary key, autoincrement integer author_id: # foreign key to Author created_at: # timestamp, set to current time on creation updated_at: # timestamp, set to current time on update # column types published_at: timestamp title: varchar(255) content: longvarchar is_spam: boolean # complex column definitions last_name: { type: varchar(100), index: true, required: true } category_id: { type: integer, foreignTable: category, foreignReference: id, required: false, onDelete: setnull } www.sensiolabs.com
  70. 70. Database Schema config/schema.yml www.sensiolabs.com
  71. 71. Build the Model Classes ./symfony propel:build-model www.sensiolabs.com
  72. 72. From Schema to Object Model $ ./symfony propel:build-model propel: lib/ post: model/ id: ~ om/ name: varchar(255) BasePost.php BasePostPeer.php Post.php PostPeer.php 1 table > 4 classes? www.sensiolabs.com
  73. 73. Base and Custom Classes lib/ Base classes model/ om/ Under model/om/, prefixed by Base BasePost.php BasePostPeer.php Generated by Propel Post.php Overwritten each time the schema PostPeer.php changes and the model is generated Never edit these files! lib/ Custom classes model/ om/ Under model/, no prefix BasePost.php BasePostPeer.php Inherit from Base classes Post.php Never overwritten PostPeer.php Put custom methods here www.sensiolabs.com Override base methods here
  74. 74. Peer and Object Classes lib/ Peer classes model/ om/ Suffixed by Peer BasePost.php Useful to retrieve a collection of objects BasePostPeer.php Post.php Methods return objects PostPeer.php Only static methods (::, self) lib/ Object classes model/ No suffix om/ BasePost.php Useful to create / inspect / update BasePostPeer.php records Post.php Methods return column values PostPeer.php Only object methods (->, $this) www.sensiolabs.com
  75. 75. Database Initialization mysqladmin create phpday ./symfony configure:database mysql://localhost/phpday www.sensiolabs.com
  76. 76. Build the SQL queries ./symfony propel:build-sql ./symfony propel:insert-sql www.sensiolabs.com
  77. 77. Shortcut for all the previous Tasks ./symfony propel:build-all www.sensiolabs.com
  78. 78. Initial Data data/fixtures/01-data.yml Define PKs with names Use names instead of Pks Dynamic values www.sensiolabs.com
  79. 79. Load Data $ ./symfony propel:data-load frontend www.sensiolabs.com
  80. 80. Summary of Code Generation 2 Object model propel:build-model Base, Custom, Peer and object classes 1 schema.yml 3 propel:build-sql propel:insert-sql Relational database Tables, columns, keys, indexes www.sensiolabs.com
  81. 81. If the Database preexists the Project 3 Object model propel:build-model Base, Custom, Peer and object classes 2 schema.yml 1 propel:build-schema Relational database Tables, columns, keys, indexes www.sensiolabs.com
  82. 82. Generated Methods of Object Classes Getter for columns CamelCase version $title = $post->getTitle(); $content = $post->getContent(); of the column name $createdAt = $post->getCreatedAt(); Some getters have special options $date = $post->getCreatedAt($dateFormat); Getter by name $title = $post->getByName('title'); www.sensiolabs.com
  83. 83. Generated Methods of Object Classes Manipulate primary keys $commentId = $comment->getId(); // for composite keys, prefer $commentId = $comment->getPrimaryKey(); Manipulate foreign keys $postId = $comment->getPostId(); // in practice, these methods are not used much // use getter for foreign objects instead $post = $comment->getPost(); // Post object // as the result is an object, you can chain method calls $content = $comment->getPost()->getContent(); One-to-Many smart getters $comments = $post->getCommments(); // Array of Comments $nb = $post->countCommments(); // Integer www.sensiolabs.com
  84. 84. Get the Posts from the Database www.sensiolabs.com
  85. 85. What the Model Layer does Action Model Database PostPeer::doSelect(new Criteria()) Criteria to SQL translation SELECT * FROM post Query execution resultset Object hydrating Array of Post objects www.sensiolabs.com
  86. 86. What the Model Layer does Template Model Database $post->getTitle() Looking up internal attribute String www.sensiolabs.com
  87. 87. Make the Post show Page dynamic /frontend_dev.php/post/show?id=1 www.sensiolabs.com
  88. 88. Make the Post show Page dynamic Display a 404 error if the post does not exist www.sensiolabs.com
  89. 89. Change the Date Format getPublishedAt() first argument accepts the date() format or the strftime() format symfony format_date() helper is i18n aware www.sensiolabs.com
  90. 90. Helper Groups •  Tag •  URLs •  Assets (images, JavaScript, CSS, …) •  Subtemplate inclusion (slot, partial, component) •  Links •  Form •  Javascript and Ajax •  Text, number, date manipulation •  I18N •  … www.sensiolabs.com
  91. 91. Permalinks • Many applications provide an alternative to functional URLs • Permalinks look like links to permanent content while the resource they reference is dynamically generated • Primarily focused at search engines, permalink often carry more readable data for end users http://www.symfony-project.org/blog/2008/05/21/new-symfony-security-policy www.sensiolabs.com
  92. 92. Links to the Post Page apps/frontend/config/routing.yml lib/model/Post.php www.sensiolabs.com
  93. 93. Links to the Post Page apps/frontend/modules/post/templates/indexSuccess.php apps/frontend/modules/post/actions/actions.class.php www.sensiolabs.com
  94. 94. Link to the Homepage www.sensiolabs.com
  95. 95. Add the Comments apps/frontend/modules/post/templates/showSuccess.php www.sensiolabs.com
  96. 96. What the Model Layer does Template Model Database $post->getComments() SELECT * FROM comment WHERE comment.post_id= ? Query execution resultset Array of Comment objects Object hydrating www.sensiolabs.com
  97. 97. Comment Form $ ./symfony propel:build-forms www.sensiolabs.com
  98. 98. Base and Custom Classes lib/ Base classes form/ Under form/base/, prefixed by Base base/ BasePostForm.class.php Generated by symfony PostForm.class.php Overwritten when the schema changes and the forms are generated Never edit these files! lib/ Custom classes form/ base/ Under form/, no prefix BasePost.Form.class.php Inherit from Base classes PostForm.class.php Never overwritten Put custom methods here www.sensiolabs.com Override base methods here
  99. 99. Create a Comment Form apps/frontend/modules/post/actions/actions.class.php apps/frontend/modules/post/templates/showSuccess.php www.sensiolabs.com
  100. 100. Create a Comment Form www.sensiolabs.com
  101. 101. Propel Forms • Generated by propel:build-forms • 1 table = 1 form • Model introspection to determine – The widget – The validation rules • Automatically converts a form to a Propel object and save it to the database • Extensible www.sensiolabs.com
  102. 102. Bind The Form to the Post www.sensiolabs.com
  103. 103. Customize the Form lib/form/CommentForm.class.php www.sensiolabs.com
  104. 104. Form Life Cycle www.sensiolabs.com
  105. 105. Comments www.sensiolabs.com
  106. 106. Security: XSS www.sensiolabs.com
  107. 107. Security: CSRF www.sensiolabs.com
  108. 108. Create the Category Page lib/model/PostPeer.class.php apps/frontend/modules/blog/actions/actions.class.php www.sensiolabs.com
  109. 109. Create the Category Page apps/frontend/config/routing.yml apps/frontend/templates/layout.php www.sensiolabs.com
  110. 110. Create a Partial for the List apps/frontend/modules/blog/templates/_list.php apps/frontend/modules/blog/templates/listByCategorySuccess.php www.sensiolabs.com
  111. 111. Create a Component apps/frontend/modules/post/actions/components.class.php apps/frontend/modules/post/templates/_categories.php apps/frontend/templates/layout.php www.sensiolabs.com
  112. 112. Create a Web Service for Posts apps/frontend/config/routing.yml apps/frontend/modules/post/templates/indexSuccess.xml.php www.sensiolabs.com
  113. 113. If we have time… • Functional Tests • Cache • CRUD to manage posts www.sensiolabs.com
  114. 114. Sensio S.A. 26, rue Salomon de Rothschild 92 286 Suresnes Cedex FRANCE Tél. : +33 1 40 99 80 80 Fax : +33 1 40 99 83 34 Contact Fabien Potencier fabien.potencier@sensio.com http://www.sensiolabs.com/ http://www.symfony-project.com/ www.sensiolabs.com

×