Hands-on with the Symfony2 Framework


Published on

Symfony2: What's all the buzz about?

Follow along as we download, install and get a hands-on experience using Symfony2. This presentation shows you how to get started with Symfony and introduces you to the large group of new PHP libraries coming from the Symfony2 community. You'll see examples of how to create pages, use template inheritance, and create a simple JSON API.

Published in: Technology
No Downloads
Total views
On SlideShare
From Embeds
Number of Embeds
Embeds 0
No embeds

No notes for slide

Hands-on with the Symfony2 Framework

  1. 1. Hands on with Symfony2 Ryan Weaver @weaverryan
  2. 2. Who is this dude?• Co-author of the Symfony2 Docs• Core Symfony2 contributor• Founder of KnpLabs US• Geek, running, Nashvillehttp://www.twitter.com/weaverryanhttp://www.github.com/weaverryan
  3. 3. iostudio• Advertising & Integrated Marketing Solutions• A great, growing Nashville tech company• Hiring good developers (of all backgrounds)to be part of a dynamic, fun team http://iostudio.com/careers
  4. 4. KnpLabsQuality. Innovation. Excitement.• Your symfony/Symfony2 development experts• Consulting & application auditing• Symfony2 Training• Behind lots of open source initiatives
  5. 5. Symfony2 Training• Right here in Nashville: May 19th & 20th • real coding, real project • Doctrine2, forms, security, caching, etc • Cool libraries like Assetic, Imagine, Behat • Lot’s more• Or join us in New York City: June 6th & 7th http://bit.ly/symfony-training
  6. 6. Act 1:Meet Symfony
  7. 7. What is Symfony2? Symfony is a PHPFramework, a Philosophy, and a Community - all working together in harmony. symfony.com/what-is-symfony
  8. 8. Symfony2• A group of standalone PHP components• Bundled into a full-service frameworkSolves your difficult, redundant problems... and then stays the hell out of the way
  9. 9. Problems Solved• Data persistence • Asset Management (via Doctrine) • Routing• Security • File+Dir Traversing• Forms • Translation• Validation • Dependency Injection• Templating • Image Manipulation• Autoloading • Console Tasks• Logging • Caching
  10. 10. Act 2:Why Symfony2?
  11. 11. Symfony2 is fast By way of comparison, Symfony 2.0 is about 3 times faster than Version 1.4 or than Zend Framework 1.10, while taking up 2 times less memory.http://symfony.com/six-good-technical-reasons
  12. 12. Symfony2 is full-featured“Symfony2 is an extremelyfull featured, modular, and crazy fast framework.” Steve Francia Vice President of Engineering at OpenSky spf13.com/post/symfony2
  13. 13. Infinitely Flexible Architecture“Symfony2 is probably one of themost flexible PHP frameworks ever created. You can literally change everything.” ~ Blog.NewITFarmer.com http://bit.ly/symfony-new-it-farmer
  14. 14. A huge community of developers• 167 core contributors• 87 documentation contributors... and counting ...
  15. 15. A huge eco-system of open source libraries • 223 open source Symfony2 bundles • 74 open source Symfony2 projects ... and counting ...
  16. 16. Symfony2Bundles.org• 223 open source bundles• 74 open source projects http://symfony2bundles.org/
  17. 17. Proven Reputation• One of the most popular PHP frameworks inthe world• First released in October 2005• Nearly 100 releases• Powers a lot of big sitesnationalguard.com, dailymotion.com, exercise.com, shopopensky.com, etc
  18. 18. Act 3:Dive into Symfony
  19. 19. The “Standard Distribution”• Symfony offers “distributions” (think Ubuntu)• The “Standard Distribution” comes witheverything you’ll need + some bonuses • Fully-functional application • Intelligent default configuration • Some demo pages we can play with
  20. 20. Step 1: Get it!symfony.com/download
  21. 21. Step 2: Unzip it!$ cd /path/to/webroot$ tar zxvf /path/to/Symfony_Standard_Vendors_2.0.0PR11.tgz
  22. 22. Step 3: Run it!http://localhost/Symfony/web/config.php
  23. 23. Tend to your Garden•Fix any major problems (e.g. missing libraries, permissions issues) that Symfony reports• Then click “Configure your Symfony Application online”
  24. 24. Step 3: Configure it! Optional: but anice interface toget you started quickly
  25. 25. Finished!This *is* yourfirst Symfony2 page
  26. 26. Act 4:Let’s create some pages
  27. 27. The 3 Steps to a Page /hello/ryanStep1: Symfony matches the URL to a routeStep2: Symfony executes the controller (a PHP function) of the routeStep3: The controller (your code) returns a Symfony Response object <h1>Hello ryan!</h1>
  28. 28. Hello {insert-name}!• Our goal: to create a hello world-like app• ... and then to make it do all sorts ofinteresting things ...remove half the code, JSON version, security,caching...
  29. 29. Step1: Symfony matches the URL to a route You define the routes (URLs) of your app _welcome: / pattern: / defaults: { _controller: AcmeDemoBundle:Welcome:index } hello_demo:/hello/ryan pattern: /hello/{name} defaults: { _controller: AcmeDemoBundle:Meetup:hello }
  30. 30. Homework Add the following route to app/config/routing.yml hello_demo: pattern: /hello/{name} defaults: { _controller: AcmeDemoBundle:Meetup:hello }** Routes can also be defined in XML, PHP and as annotations
  31. 31. Step2: Symfony executes the controller of the route hello_demo: pattern: /hello/{name} defaults: { _controller: AcmeDemoBundle:Meetup:hello } Controller Class::method()AcmeDemoBundleControllerMeetupController::helloAction() Symfony will execute this PHP method
  32. 32. Homework Create the controller class:<?php// src/Acme/DemoBundle/Controller/MeetupController.phpnamespace AcmeDemoBundleController;use SymfonyBundleFrameworkBundleControllerController;use SymfonyComponentHttpFoundationResponse;class MeetupController extends Controller{ public function helloAction($name) { return new Response(Hello .$name); }}
  33. 33. Step 3: The Controller returnsa Symfony Response objectuse SymfonyComponentHttpFoundationResponse;public function helloAction($name){ return new Response(Hello .$name);} This is the only requirement of a controller
  34. 34. Routing Placeholders The route matches URLs like /hello/* hello_demo: pattern: /hello/{name} defaults: { _controller: AcmeDemoBundle:Meetup:hello } use SymfonyComponentHttpFoundationResponse; public function helloAction($name) { return new Response(Hello .$name); }And gives you access to the {name} value
  35. 35. It’s Alive!http://localhost/Symfony/web/app_dev.php/hello/ryan
  36. 36. Rendering a Template• A template is a tool that you may choose to use• A template is used to generate “presentation”code (e.g. HTML)• Keep your pretty (<div>) code away from yournerdy ($foo->sendEmail($body)) code
  37. 37. Homework Render a template in the controllerpublic function helloAction($name){ $response = $this->render( AcmeDemoBundle:Meetup:hello.html.twig, array(name => $name) ); return $response;}
  38. 38. Homework Create the template file {# src/Acme/DemoBundle/Resources/views/Meetup/hello.html.twig #} Hello {{ name }} This is TwigTwig is a fast, secure and powerful templating engineWe *LOVE* Twig... butSymfony2 fully supports Twig and regularPHP templates
  39. 39. It’s Still Alive!http://localhost/Symfony/web/app_dev.php/hello/ryan
  40. 40. Dress that Template• All pages share common elements (header,footer, sidebar, etc)• We think about the problem differently: atemplate can be decorated by another
  41. 41. template inheritance allows you to build abase "layout" template that contains all thecommon elements of your site and defines"blocks" that child templates can override
  42. 42. A base layout file header defines “blocks”Each block can have a default value sidebar content{% block header %} <h1>Welcome!</h1>{% endblock %}
  43. 43. The child template “extends” header the parentand “overrides” the parent’s sidebar content blocks{% block header %} <h1>Super hello Welcome!</h1>{% endblock %}
  44. 44. Homework Make the template extend a base template{# src/Acme/DemoBundle/Resources/views/Meetup/hello.html.twig #}{% extends "AcmeDemoBundle::layout.html.twig" %}{% block title "Hello " ~ name %}{% block content %} <h1>Hello {{ name }}!</h1>{% endblock %}layout: src/Acme/DemoBundle/Resources/views/layout.html.twig
  45. 45. It’s Beautiful!http://localhost/Symfony/web/app_dev.php/hello/ryan
  46. 46. Act 5:Remove all the code
  47. 47. Do Less Work• So far, we have: • a route • a controller • a template• We can do all of this with even less code
  48. 48. Homework Change your app/config/routing.ymlhello_demo: resource: "@AcmeDemoBundle/Controller/MeetupController.php" type: annotationThis now imports routing information from our controller
  49. 49. Homework Add the route to your controller /** * @extra:Route("/hello/{name}", name="hello_demo") */ The PHP comments are public function helloAction($name) { $response = $this->render( called “annotations” AcmeDemoBundle:Meetup:hello.html.twig, array(name => $name)Symfony can use annotations to read routing config ); return $response;Your route and controller are in the same place! }
  50. 50. Annotations /** * @extra:Route("/hello/{name}", name="hello_demo") */ public function helloAction($name) The PHP { $response = $this->render( comments are AcmeDemoBundle:Meetup:hello.html.twig, array(name => $name) called ); “annotations” return $response; }Symfony can use annotations to read routing configYour route and controller are in the same place!
  51. 51. Remove more codeInstead of rendering the template, tell Symfonyto do it for you /** * @extra:Route("/hello/{name}", name="hello_demo") * @extra:Template() */ public function helloAction($name) { return array(name => $name); }
  52. 52. /** * @extra:Route("/hello/{name}", name="hello_demo") * @extra:Template() */ public function helloAction($name) { return array(name => $name); } Controller: AcmeDemoBundle:Meetup:helloTemplate: AcmeDemoBundle:Meetup:hello.html.twig
  53. 53. Now with less code!http://localhost/Symfony/web/app_dev.php/hello/ryan
  54. 54. Act 6:JSON { name: “Ryan” }
  55. 55. Create a JSON API• We have an HTML version of our page• How about a JSON version?
  56. 56. Add a _format to the route/** * @extra:Route("/hello/{name}.{_format}", defaults={"_format"="html"}) * @extra:Template() */public function helloAction($name){ return array(name => $name);}“/hello/ryan” still works exactly as before
  57. 57. Create a JSON template{# src/Acme/DemoBundle/Resources/views/Meetup/hello.json.twig #}{% set arr = { name: name } %}{{ arr | json_encode | raw }} “/hello/ryan.json” renders a JSON array {"name":"ryan"} It’s that simple
  58. 58. To review• Symfony looks for the value of the special“_format” routing placeholder• The _format is used in the name of thetemplate (hello.json.twig)• Symfony also returns the proper Content-Type (application/json)
  59. 59. RestBundle • For a truly robust solution to RESTful API’s, see the community-driven RestBundlehttps://github.com/FriendsOfSymfony/RestBundle
  60. 60. Act 7:With annotations, you can
  61. 61. Add security/** * @extra:Route("/hello/admin/{name}") * @extra:Secure(roles="ROLE_ADMIN") * @extra:Template() */public function helloadminAction($name){ return array(name => $name);}
  62. 62. Add caching/** * @extra:Route("/hello/{name}.{_format}", defaults={"_format"="html"}) * @extra:Template() * @extra:Cache(maxage="86400") */public function helloAction($name){ return array(name => $name);}
  63. 63. Act 8:PHP Libraries by theSymfony Community
  64. 64. Doctrine2 http://www.doctrine-project.org/• Database Abstraction Library (DBAL)• Object Relational Mapper (ORM)• Object Document Mapper (ODM) --> (for Mongo DB)Doctrine persists data better than anyone
  65. 65. Assetic https://github.com/kriswallsmith/assetic• PHP asset management framework• Run CSS and JS through filters • LESS, SASS and others • Compress the assets• Compile CSS and JS into a single file each
  66. 66. Behat + Mink http://behat.org/• Behavioral-driven development framework• Write human-readable sentences that testyour code (and can be run in a browser)
  67. 67. Gaufrette https://github.com/knplabs/Gaufrette• PHP filesystem abstraction library // ... setup your filesystem $content = $filesystem->read(myFile); $content = Hello I am the new content; $filesystem->write(myFile, $content);• Read and write from Amazon S3 or FTP like alocal filesystem
  68. 68. Imagine https://github.com/avalanche123/Imagine• PHP Image manipulation library use ImagineImageBox; use ImagineImagePoint; $image->resize(new Box(15, 25)) ->rotate(45) ->crop(new Point(0, 0), new Box(45, 45)) ->save(/path/to/new/image.jpg);• Does crazy things and has crazy docs
  69. 69. Silex http://silex-project.org/• Microframework built from Symfony2 Components require_once __DIR__./silex.phar; $app = new SilexApplication(); $app->get(/hello/{name}, function($name) { return "Hello $name"; }); $app->run();• That’s your whole app :)
  70. 70. Sonata Admin Bundle https://github.com/sonata-project/AdminBundle• Admin generator for Symfony2
  71. 71. Act 9:Last words
  72. 72. Symfony2 is...• Fast as hell• Infinitely flexible• Fully-featured• Driven by a huge community• Not released yet... Release candidate coming very soon...
  73. 73. Thanks! Questions? Ryan Weaver @weaverryan Symfony2 Training in NashvilleJoin us May 19th & 20th