Hands on with
 Symfony2
   Ryan Weaver
   @weaverryan
Who is this dude?
• Co-author of the Symfony2 Docs

• Core Symfony2 contributor

• Founder of KnpLabs US

• Geek, running, Nashville
http://www.twitter.com/weaverryan
http://www.github.com/weaverryan
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
KnpLabs
Quality. Innovation. Excitement.

• Your symfony/Symfony2 development experts
• Consulting & application auditing
• Symfony2 Training
• Behind lots of open source initiatives
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
Act 1:

Meet Symfony
What is Symfony2?

      Symfony is a PHP
Framework, a Philosophy, and
  a Community - all working
     together in harmony.


  symfony.com/what-is-symfony
Symfony2
• A group of standalone PHP components

• Bundled into a full-service framework

Solves your difficult, redundant problems

... and then stays the hell out of the way
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
Act 2:

Why Symfony2?
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
Symfony2 is full-featured
“Symfony2 is an extremely
full featured, modular, and
  crazy fast framework.”
              Steve Francia
              Vice President of Engineering at OpenSky




    spf13.com/post/symfony2
Infinitely Flexible Architecture
“Symfony2 is probably one of the
most flexible PHP frameworks ever
 created. You can literally change
           everything.”

                    ~ Blog.NewITFarmer.com



 http://bit.ly/symfony-new-it-farmer
A huge community of
       developers
• 167 core contributors
• 87 documentation contributors
... and counting ...
A huge eco-system of open
     source libraries
 • 223 open source Symfony2 bundles
 • 74 open source Symfony2 projects
 ... and counting ...
Symfony2Bundles.org


• 223 open source bundles
• 74 open source projects


     http://symfony2bundles.org/
Proven Reputation
• One of the most popular PHP frameworks in
the world

• First released in October 2005
• Nearly 100 releases
• Powers a lot of big sites
nationalguard.com, dailymotion.com, exercise.com, shopopensky.com, etc
Act 3:

Dive into Symfony
The “Standard Distribution”
• Symfony offers “distributions” (think Ubuntu)

• The “Standard Distribution” comes with
everything you’ll need + some bonuses

  • Fully-functional application
  • Intelligent default configuration
  • Some demo pages we can play with
Step 1: Get it!




symfony.com/download
Step 2: Unzip it!


$ cd /path/to/webroot

$ tar zxvf /path/to/Symfony_Standard_Vendors_2.0.0PR11.tgz
Step 3: Run it!




http://localhost/Symfony/web/config.php
Tend to your Garden

•Fix any major problems (e.g. missing libraries,
 permissions issues) that Symfony reports

• Then click “Configure your Symfony
 Application online”
Step 3: Configure it!

 Optional: but a
nice interface to
get you started
     quickly
Finished!


This *is* your
first Symfony2
     page
Act 4:

Let’s create some pages
The 3 Steps to a Page
                /hello/ryan
Step1: Symfony matches the URL to a route

Step2: Symfony executes the controller (a
      PHP function) of the route

Step3: The controller (your code) returns a
       Symfony Response object

          <h1>Hello ryan!</h1>
Hello {insert-name}!


• Our goal: to create a hello world-like app

• ... and then to make it do all sorts of
interesting things ...

remove half the code, JSON version, security,
caching...
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 }
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
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
Homework
           Create the controller class:
<?php
// src/Acme/DemoBundle/Controller/MeetupController.php
namespace AcmeDemoBundleController;

use SymfonyBundleFrameworkBundleControllerController;
use SymfonyComponentHttpFoundationResponse;

class MeetupController extends Controller
{
    public function helloAction($name)
    {
        return new Response('Hello '.$name);
    }
}
Step 3: The Controller returns
a Symfony Response object
use SymfonyComponentHttpFoundationResponse;

public function helloAction($name)
{
    return new Response('Hello '.$name);
}


  This is the only requirement of a controller
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
It’s Alive!




http://localhost/Symfony/web/app_dev.php/hello/ryan
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 your
nerdy ($foo->sendEmail($body)) code
Homework
      Render a template in the controller

public function helloAction($name)
{
    $response = $this->render(
        'AcmeDemoBundle:Meetup:hello.html.twig',
        array('name' => $name)
    );

    return $response;
}
Homework
                     Create the template file
  {# src/Acme/DemoBundle/Resources/views/Meetup/hello.html.twig #}

  Hello {{ name }}


     This is Twig
Twig is a fast, secure and powerful templating engine

We *LOVE* Twig... but

Symfony2 fully supports Twig and regular
PHP templates
It’s Still Alive!




http://localhost/Symfony/web/app_dev.php/hello/ryan
Dress that Template
• All pages share common elements (header,
footer, sidebar, etc)

• We think about the problem differently: a
template can be decorated by another
template inheritance allows you to build a
base "layout" template that contains all the
common elements of your site and defines
"blocks" that child templates can override
A base layout file                header
 defines “blocks”

Each block can have
  a default value       sidebar            content

{% block header %}
    <h1>Welcome!</h1>
{% endblock %}
The child template “extends”                  header

         the parent


and “overrides” the parent’s        sidebar            content


          blocks


{% block header %}
    <h1>Super hello Welcome!</h1>
{% endblock %}
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
It’s Beautiful!




http://localhost/Symfony/web/app_dev.php/hello/ryan
Act 5:

Remove all the code
Do Less Work
• So far, we have:
  • a route
  • a controller
  • a template

• We can do all of this with even less code
Homework
                     Change your
                 app/config/routing.yml

hello_demo:
    resource: "@AcmeDemoBundle/Controller/MeetupController.php"
    type:     annotation



This now imports routing information from our controller
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!
   }
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 config
Your route and controller are in the same place!
Remove more code
Instead of rendering the template, tell Symfony
to do it for you
   /**
     * @extra:Route("/hello/{name}", name="hello_demo")
     * @extra:Template()
     */
   public function helloAction($name)
   {
        return array('name' => $name);
   }
/**
      * @extra:Route("/hello/{name}", name="hello_demo")
      * @extra:Template()
      */
    public function helloAction($name)
    {
         return array('name' => $name);
    }



   Controller: AcmeDemoBundle:Meetup:hello


Template: AcmeDemoBundle:Meetup:hello.html.twig
Now with less code!




http://localhost/Symfony/web/app_dev.php/hello/ryan
Act 6:

JSON { name: “Ryan” }
Create a JSON API
• We have an HTML version of our page

• How about a JSON version?
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
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
To review
• Symfony looks for the value of the special
“_format” routing placeholder

• The _format is used in the name of the
template (hello.json.twig)

• Symfony also returns the proper Content-
Type (application/json)
RestBundle
  • For a truly robust solution to RESTful API’s,
  see the community-driven RestBundle




https://github.com/FriendsOfSymfony/RestBundle
Act 7:

With annotations, you can
Add security
/**
  * @extra:Route("/hello/admin/{name}")
  * @extra:Secure(roles="ROLE_ADMIN")
  * @extra:Template()
  */
public function helloadminAction($name)
{
     return array('name' => $name);
}
Add caching

/**
  * @extra:Route("/hello/{name}.{_format}", defaults={"_format"="html"})
  * @extra:Template()
  * @extra:Cache(maxage="86400")
  */
public function helloAction($name)
{
     return array('name' => $name);
}
Act 8:

PHP Libraries by the
Symfony Community
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
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
Behat + Mink
                http://behat.org/

• Behavioral-driven development framework




• Write human-readable sentences that test
your code (and can be run in a browser)
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 a
local filesystem
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
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 :)
Sonata Admin Bundle
  https://github.com/sonata-project/AdminBundle
• Admin generator for Symfony2
Act 9:

Last words
Symfony2 is...

• Fast as hell
• Infinitely flexible
• Fully-featured
• Driven by a huge community

• Not released yet...
    Release candidate coming very soon...
Thanks!
                      Questions?
                   Ryan Weaver
                   @weaverryan



  Symfony2 Training
    in Nashville

Join us May 19th & 20th

Hands-on with the Symfony2 Framework

  • 1.
    Hands on with Symfony2 Ryan Weaver @weaverryan
  • 2.
    Who is thisdude? • Co-author of the Symfony2 Docs • Core Symfony2 contributor • Founder of KnpLabs US • Geek, running, Nashville http://www.twitter.com/weaverryan http://www.github.com/weaverryan
  • 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.
    KnpLabs Quality. Innovation. Excitement. •Your symfony/Symfony2 development experts • Consulting & application auditing • Symfony2 Training • Behind lots of open source initiatives
  • 5.
    Symfony2 Training • Righthere 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.
  • 7.
    What is Symfony2? Symfony is a PHP Framework, a Philosophy, and a Community - all working together in harmony. symfony.com/what-is-symfony
  • 8.
    Symfony2 • A groupof standalone PHP components • Bundled into a full-service framework Solves your difficult, redundant problems ... and then stays the hell out of the way
  • 9.
    Problems Solved • Datapersistence • Asset Management (via Doctrine) • Routing • Security • File+Dir Traversing • Forms • Translation • Validation • Dependency Injection • Templating • Image Manipulation • Autoloading • Console Tasks • Logging • Caching
  • 10.
  • 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.
    Symfony2 is full-featured “Symfony2is an extremely full featured, modular, and crazy fast framework.” Steve Francia Vice President of Engineering at OpenSky spf13.com/post/symfony2
  • 13.
    Infinitely Flexible Architecture “Symfony2is probably one of the most flexible PHP frameworks ever created. You can literally change everything.” ~ Blog.NewITFarmer.com http://bit.ly/symfony-new-it-farmer
  • 14.
    A huge communityof developers • 167 core contributors • 87 documentation contributors ... and counting ...
  • 15.
    A huge eco-systemof open source libraries • 223 open source Symfony2 bundles • 74 open source Symfony2 projects ... and counting ...
  • 16.
    Symfony2Bundles.org • 223 opensource bundles • 74 open source projects http://symfony2bundles.org/
  • 17.
    Proven Reputation • Oneof the most popular PHP frameworks in the world • First released in October 2005 • Nearly 100 releases • Powers a lot of big sites nationalguard.com, dailymotion.com, exercise.com, shopopensky.com, etc
  • 18.
  • 19.
    The “Standard Distribution” •Symfony offers “distributions” (think Ubuntu) • The “Standard Distribution” comes with everything you’ll need + some bonuses • Fully-functional application • Intelligent default configuration • Some demo pages we can play with
  • 20.
    Step 1: Getit! symfony.com/download
  • 21.
    Step 2: Unzipit! $ cd /path/to/webroot $ tar zxvf /path/to/Symfony_Standard_Vendors_2.0.0PR11.tgz
  • 22.
    Step 3: Runit! http://localhost/Symfony/web/config.php
  • 23.
    Tend to yourGarden •Fix any major problems (e.g. missing libraries, permissions issues) that Symfony reports • Then click “Configure your Symfony Application online”
  • 24.
    Step 3: Configureit! Optional: but a nice interface to get you started quickly
  • 25.
  • 26.
  • 27.
    The 3 Stepsto a Page /hello/ryan Step1: Symfony matches the URL to a route Step2: Symfony executes the controller (a PHP function) of the route Step3: The controller (your code) returns a Symfony Response object <h1>Hello ryan!</h1>
  • 28.
    Hello {insert-name}! • Ourgoal: to create a hello world-like app • ... and then to make it do all sorts of interesting things ... remove half the code, JSON version, security, caching...
  • 29.
    Step1: Symfony matchesthe 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.
    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.
    Step2: Symfony executesthe 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.
    Homework Create the controller class: <?php // src/Acme/DemoBundle/Controller/MeetupController.php namespace AcmeDemoBundleController; use SymfonyBundleFrameworkBundleControllerController; use SymfonyComponentHttpFoundationResponse; class MeetupController extends Controller { public function helloAction($name) { return new Response('Hello '.$name); } }
  • 33.
    Step 3: TheController returns a Symfony Response object use SymfonyComponentHttpFoundationResponse; public function helloAction($name) { return new Response('Hello '.$name); } This is the only requirement of a controller
  • 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.
  • 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 your nerdy ($foo->sendEmail($body)) code
  • 37.
    Homework Render a template in the controller public function helloAction($name) { $response = $this->render( 'AcmeDemoBundle:Meetup:hello.html.twig', array('name' => $name) ); return $response; }
  • 38.
    Homework Create the template file {# src/Acme/DemoBundle/Resources/views/Meetup/hello.html.twig #} Hello {{ name }} This is Twig Twig is a fast, secure and powerful templating engine We *LOVE* Twig... but Symfony2 fully supports Twig and regular PHP templates
  • 39.
  • 40.
    Dress that Template •All pages share common elements (header, footer, sidebar, etc) • We think about the problem differently: a template can be decorated by another
  • 41.
    template inheritance allowsyou to build a base "layout" template that contains all the common elements of your site and defines "blocks" that child templates can override
  • 42.
    A base layoutfile header defines “blocks” Each block can have a default value sidebar content {% block header %} <h1>Welcome!</h1> {% endblock %}
  • 43.
    The child template“extends” header the parent and “overrides” the parent’s sidebar content blocks {% block header %} <h1>Super hello Welcome!</h1> {% endblock %}
  • 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.
  • 46.
  • 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.
    Homework Change your app/config/routing.yml hello_demo: resource: "@AcmeDemoBundle/Controller/MeetupController.php" type: annotation This now imports routing information from our controller
  • 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.
    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 config Your route and controller are in the same place!
  • 51.
    Remove more code Insteadof rendering the template, tell Symfony to do it for you /** * @extra:Route("/hello/{name}", name="hello_demo") * @extra:Template() */ public function helloAction($name) { return array('name' => $name); }
  • 52.
    /** * @extra:Route("/hello/{name}", name="hello_demo") * @extra:Template() */ public function helloAction($name) { return array('name' => $name); } Controller: AcmeDemoBundle:Meetup:hello Template: AcmeDemoBundle:Meetup:hello.html.twig
  • 53.
    Now with lesscode! http://localhost/Symfony/web/app_dev.php/hello/ryan
  • 54.
    Act 6: JSON {name: “Ryan” }
  • 55.
    Create a JSONAPI • We have an HTML version of our page • How about a JSON version?
  • 56.
    Add a _formatto 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.
    Create a JSONtemplate {# 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.
    To review • Symfonylooks for the value of the special “_format” routing placeholder • The _format is used in the name of the template (hello.json.twig) • Symfony also returns the proper Content- Type (application/json)
  • 59.
    RestBundle •For a truly robust solution to RESTful API’s, see the community-driven RestBundle https://github.com/FriendsOfSymfony/RestBundle
  • 60.
  • 61.
    Add security /** * @extra:Route("/hello/admin/{name}") * @extra:Secure(roles="ROLE_ADMIN") * @extra:Template() */ public function helloadminAction($name) { return array('name' => $name); }
  • 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.
    Act 8: PHP Librariesby the Symfony Community
  • 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.
    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.
    Behat + Mink http://behat.org/ • Behavioral-driven development framework • Write human-readable sentences that test your code (and can be run in a browser)
  • 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 a local filesystem
  • 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.
    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.
    Sonata Admin Bundle https://github.com/sonata-project/AdminBundle • Admin generator for Symfony2
  • 71.
  • 72.
    Symfony2 is... • Fastas hell • Infinitely flexible • Fully-featured • Driven by a huge community • Not released yet... Release candidate coming very soon...
  • 73.
    Thanks! Questions? Ryan Weaver @weaverryan Symfony2 Training in Nashville Join us May 19th & 20th