SlideShare a Scribd company logo
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

More Related Content

PDF
Symfony2: Get your project started
PDF
Symony2 A Next Generation PHP Framework
PDF
Twig: Friendly Curly Braces Invade Your Templates!
PDF
Create a Symfony Application from a Drupal Perspective
PDF
PDF
Symfony internals [english]
ODP
Mastering Namespaces in PHP
PDF
PHP traits, treat or threat?
Symfony2: Get your project started
Symony2 A Next Generation PHP Framework
Twig: Friendly Curly Braces Invade Your Templates!
Create a Symfony Application from a Drupal Perspective
Symfony internals [english]
Mastering Namespaces in PHP
PHP traits, treat or threat?

What's hot (20)

PDF
Behavior & Specification Driven Development in PHP - #OpenWest
PDF
Learning puppet chapter 2
PDF
Maven 3.0 at Øredev
PPTX
PHP 7 Crash Course - php[world] 2015
PDF
Mastering Maven 2.0 In 1 Hour V1.3
DOCX
PHP NOTES FOR BEGGINERS
PDF
The new features of PHP 7
PDF
Webpack Encore Symfony Live 2017 San Francisco
PDF
Creating custom themes in AtoM
PDF
Composer
PDF
Phpbasics
PDF
Last train to php 7
PDF
Php simple
PDF
Jumping Into WordPress Plugin Programming
PDF
The Coolest Symfony Components you’ve never heard of - DrupalCon 2017
PPT
Php mysql
PPTX
PHP 5.3
PDF
Symfony Components
PDF
Behaviour Driven Development con Behat & Drupal
PDF
Getting big without getting fat, in perl
Behavior & Specification Driven Development in PHP - #OpenWest
Learning puppet chapter 2
Maven 3.0 at Øredev
PHP 7 Crash Course - php[world] 2015
Mastering Maven 2.0 In 1 Hour V1.3
PHP NOTES FOR BEGGINERS
The new features of PHP 7
Webpack Encore Symfony Live 2017 San Francisco
Creating custom themes in AtoM
Composer
Phpbasics
Last train to php 7
Php simple
Jumping Into WordPress Plugin Programming
The Coolest Symfony Components you’ve never heard of - DrupalCon 2017
Php mysql
PHP 5.3
Symfony Components
Behaviour Driven Development con Behat & Drupal
Getting big without getting fat, in perl
Ad

Similar to Hands-on with the Symfony2 Framework (20)

PDF
Symfony quick tour_2.3
PPT
Workshop: Symfony2 Intruduction: (Controller, Routing, Model)
PDF
Build powerfull and smart web applications with Symfony2
PDF
The Naked Bundle - Tryout
ODP
Routing
PDF
Symfony2 San Francisco Meetup 2009
PDF
Symfony: Your Next Microframework (SymfonyCon 2015)
PDF
symfony: An Open-Source Framework for Professionals (Dutch Php Conference 2008)
PPTX
Creating your own framework on top of Symfony2 Components
PDF
C:\fake path\askeet 1.0-en
PDF
Silex Cheat Sheet
PDF
Silex Cheat Sheet
PDF
Symfony 2.0 on PHP 5.3
PDF
Symfony tips and tricks
PDF
Symfony2 revealed
PDF
Symfony2 for Midgard Developers
PDF
The Naked Bundle - Symfony Usergroup Belgium
PDF
The Naked Bundle - Symfony Barcelona
PDF
Symfony 2 (PHP Quebec 2009)
PDF
Symfony2 - WebExpo 2010
Symfony quick tour_2.3
Workshop: Symfony2 Intruduction: (Controller, Routing, Model)
Build powerfull and smart web applications with Symfony2
The Naked Bundle - Tryout
Routing
Symfony2 San Francisco Meetup 2009
Symfony: Your Next Microframework (SymfonyCon 2015)
symfony: An Open-Source Framework for Professionals (Dutch Php Conference 2008)
Creating your own framework on top of Symfony2 Components
C:\fake path\askeet 1.0-en
Silex Cheat Sheet
Silex Cheat Sheet
Symfony 2.0 on PHP 5.3
Symfony tips and tricks
Symfony2 revealed
Symfony2 for Midgard Developers
The Naked Bundle - Symfony Usergroup Belgium
The Naked Bundle - Symfony Barcelona
Symfony 2 (PHP Quebec 2009)
Symfony2 - WebExpo 2010
Ad

More from Ryan Weaver (15)

PDF
Finally, Professional Frontend Dev with ReactJS, WebPack & Symfony (Symfony C...
PDF
Symfony Guard Authentication: Fun with API Token, Social Login, JWT and more
PDF
Guard Authentication: Powerful, Beautiful Security
PDF
Grand Rapids PHP Meetup: Behavioral Driven Development with Behat
PDF
Master the New Core of Drupal 8 Now: with Symfony and Silex
PDF
Silex: Microframework y camino fácil de aprender Symfony
PDF
Drupal 8: Huge wins, a Bigger Community, and why you (and I) will Love it
PDF
Cool like a Frontend Developer: Grunt, RequireJS, Bower and other Tools
PDF
The Wonderful World of Symfony Components
PDF
A PHP Christmas Miracle - 3 Frameworks, 1 app
PDF
Being Dangerous with Twig (Symfony Live Paris)
PDF
Being Dangerous with Twig
PDF
Doctrine2 In 10 Minutes
PDF
Dependency Injection: Make your enemies fear you
PDF
The Art of Doctrine Migrations
Finally, Professional Frontend Dev with ReactJS, WebPack & Symfony (Symfony C...
Symfony Guard Authentication: Fun with API Token, Social Login, JWT and more
Guard Authentication: Powerful, Beautiful Security
Grand Rapids PHP Meetup: Behavioral Driven Development with Behat
Master the New Core of Drupal 8 Now: with Symfony and Silex
Silex: Microframework y camino fácil de aprender Symfony
Drupal 8: Huge wins, a Bigger Community, and why you (and I) will Love it
Cool like a Frontend Developer: Grunt, RequireJS, Bower and other Tools
The Wonderful World of Symfony Components
A PHP Christmas Miracle - 3 Frameworks, 1 app
Being Dangerous with Twig (Symfony Live Paris)
Being Dangerous with Twig
Doctrine2 In 10 Minutes
Dependency Injection: Make your enemies fear you
The Art of Doctrine Migrations

Recently uploaded (20)

PPTX
1. Introduction to Computer Programming.pptx
PPTX
Big Data Technologies - Introduction.pptx
PDF
Mobile App Security Testing_ A Comprehensive Guide.pdf
PDF
Encapsulation_ Review paper, used for researhc scholars
PPTX
A Presentation on Artificial Intelligence
PDF
NewMind AI Weekly Chronicles - August'25-Week II
PDF
Advanced methodologies resolving dimensionality complications for autism neur...
PPTX
Spectroscopy.pptx food analysis technology
PDF
cuic standard and advanced reporting.pdf
PPTX
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
PPT
Teaching material agriculture food technology
PPTX
Digital-Transformation-Roadmap-for-Companies.pptx
PDF
Electronic commerce courselecture one. Pdf
PPTX
Group 1 Presentation -Planning and Decision Making .pptx
PDF
The Rise and Fall of 3GPP – Time for a Sabbatical?
PDF
Profit Center Accounting in SAP S/4HANA, S4F28 Col11
PDF
Machine learning based COVID-19 study performance prediction
PDF
Accuracy of neural networks in brain wave diagnosis of schizophrenia
PPTX
Machine Learning_overview_presentation.pptx
PDF
Empathic Computing: Creating Shared Understanding
1. Introduction to Computer Programming.pptx
Big Data Technologies - Introduction.pptx
Mobile App Security Testing_ A Comprehensive Guide.pdf
Encapsulation_ Review paper, used for researhc scholars
A Presentation on Artificial Intelligence
NewMind AI Weekly Chronicles - August'25-Week II
Advanced methodologies resolving dimensionality complications for autism neur...
Spectroscopy.pptx food analysis technology
cuic standard and advanced reporting.pdf
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
Teaching material agriculture food technology
Digital-Transformation-Roadmap-for-Companies.pptx
Electronic commerce courselecture one. Pdf
Group 1 Presentation -Planning and Decision Making .pptx
The Rise and Fall of 3GPP – Time for a Sabbatical?
Profit Center Accounting in SAP S/4HANA, S4F28 Col11
Machine learning based COVID-19 study performance prediction
Accuracy of neural networks in brain wave diagnosis of schizophrenia
Machine Learning_overview_presentation.pptx
Empathic Computing: Creating Shared Understanding

Hands-on with the Symfony2 Framework

  • 1. Hands on with Symfony2 Ryan Weaver @weaverryan
  • 2. 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
  • 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 • 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
  • 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 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
  • 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
  • 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 “Symfony2 is 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 “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
  • 14. A huge community of developers • 167 core contributors • 87 documentation contributors ... and counting ...
  • 15. A huge eco-system of open source libraries • 223 open source Symfony2 bundles • 74 open source Symfony2 projects ... and counting ...
  • 16. Symfony2Bundles.org • 223 open source bundles • 74 open source projects http://symfony2bundles.org/
  • 17. 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
  • 18. Act 3: Dive into Symfony
  • 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: Get it! symfony.com/download
  • 21. Step 2: Unzip it! $ cd /path/to/webroot $ tar zxvf /path/to/Symfony_Standard_Vendors_2.0.0PR11.tgz
  • 22. Step 3: Run it! http://localhost/Symfony/web/config.php
  • 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. Step 3: Configure it! Optional: but a nice interface to get you started quickly
  • 26. Act 4: Let’s create some pages
  • 27. 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>
  • 28. 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...
  • 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. 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 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. 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: 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
  • 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
  • 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
  • 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 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
  • 42. A base layout file 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
  • 46. Act 5: Remove all the code
  • 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 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); }
  • 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 less code! http://localhost/Symfony/web/app_dev.php/hello/ryan
  • 54. Act 6: JSON { name: “Ryan” }
  • 55. Create a JSON API • We have an HTML version of our page • How about a JSON version?
  • 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. 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. 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)
  • 59. RestBundle • For a truly robust solution to RESTful API’s, see the community-driven RestBundle https://github.com/FriendsOfSymfony/RestBundle
  • 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 Libraries by 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
  • 72. Symfony2 is... • Fast as 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