symony2 a next generation php framework
DESCRIPTION
A mixture of architecture and hands-on examples, this presentation takes you through the killer features of Symfony2, how it's so decoupled, and how you can get started developing in it.As an added bonus, a number of new standalone PHP libraries and tools are mentioned at the end.TRANSCRIPT
Symfony2The Next Generation
PHP FrameworkRyan Weaver@weaverryan
Thursday, May 12, 2011
Who is this dude?
• Co-author of the Symfony2 Docs
• Core Symfony2 contributor
• Founder of KnpLabs US
• Boyfriend of the much more talented @leannapelham
http://www.knplabs.com/enhttp://www.github.com/weaverryan
Thursday, May 12, 2011
Quality. Innovation. Excitement.
• Your symfony/Symfony2 development experts
• Active in a ton of open source initiatives
• Consulting, application auditing and training
KnpLabs
http://bit.ly/symfony-training
Thursday, May 12, 2011
Act 1:
What is Symphony?Symfony!
Thursday, May 12, 2011
A Bunch of Standalone LibsDoctrine2 DBALRouting HttpFoundation
Form Validator
Security
Monolog Twig
SwiftMailer
AsseticDependencyInjection
HttpKernel
BrowserKit
ClassLoader
ConsoleSerializer
Yaml
Translation
Templating
Process FinderDomCrawler
CSSSelector
EventDispatcher
Doctrine2 ORM
Doctrine2 ODM
Thursday, May 12, 2011
A Bunch of Standalone LibsDoctrine2 DBALRouting HttpFoundation
Form Validator
Security
Monolog Twig
SwiftMailer
AsseticDependencyInjection
HttpKernel
BrowserKit
ClassLoader
ConsoleSerializer
Yaml
Translation
Templating
Process FinderDomCrawler
CSSSelector
EventDispatcher
Doctrine2 ORM
Doctrine2 ODM
Symfony is a group of standalone components and
other standalone PHP libraries
Decoupled building blocks for any web application
Thursday, May 12, 2011
Doctrine2 DBALRouting HttpFoundation
Form Validator
Security
Monolog
Twig
SwiftMailer
AsseticDependencyInjection
HttpKernel
BrowserKit
ClassLoader
ConsoleSerializer Yaml
Translation
TemplatingProcess
FinderDomCrawler
CSSSelector
EventDispatcher Doctrine2 ORM
Doctrine2 ODM
• A set of bundles containing configuration and bridge classes
• These glue the components together, giving the developer a consistent experience
What is the Symfony2 Framework?
Thursday, May 12, 2011
Doctrine2 DBALRouting HttpFoundation
Form Validator
Security
Monolog
Twig
SwiftMailer
AsseticDependencyInjection
HttpKernel
BrowserKit
ClassLoader
ConsoleSerializer Yaml
Translation
TemplatingProcess
FinderDomCrawler
CSSSelector
EventDispatcher Doctrine2 ORM
Doctrine2 ODM
FrameworkBundle SecurityBundle DoctrineBundle
MonologBundleTwigBundle SwiftmailerBundle
WebProfilerBundle AsseticBundle
The Symfony2 Framework
Thursday, May 12, 2011
FrameworkBundle SecurityBundle
MonologBundleTwigBundle
WebProfilerBundle
The Flexibility of Bundles• A bundle is like a plugin, except that even the core framework is implemented as bundles
• Your code is an equal citizen with the core
AcmeBlogBundle
AcmeAccountBundleAcmeTwigBundle
Thursday, May 12, 2011
Symfony2 is a set of standalone PHP component libraries, glued together by a group of removable “bundles”
Thursday, May 12, 2011
Act 2:
Keep Things Simple
Thursday, May 12, 2011
From space, the Web is stupid-simple
Client(e.g. browser) Your App
/foo
the request
<h1>FOO!</h1>
the response
Thursday, May 12, 2011
HTTP Request-Response
• Your job is always to generate and return a response
• Symfony’s goal is to:• take care of repetitive tasks (e.g. routing)• allow your code to be organized• offer optional tools for complex tasks (e.g. security, forms, etc)
• to stay the hell out of your way!
Thursday, May 12, 2011
Keep it simple: write code that represents your business logic - don’t bend to your framework
Thursday, May 12, 2011
Act 3:
Symfony in Action
Thursday, May 12, 2011
• Symfony offers “distributions” (think Ubuntu)
• Download the “Standard Distribution” to instantly have a functional application
• Default Project Structure• Common Sense default configuration• Some demo pages to play with
Start developing immediately!!!
Symfony Distributions
Thursday, May 12, 2011
Step 1: Get it!
http://symfony.com/download
Thursday, May 12, 2011
Step 2: Unzip it!
$ cd /path/to/webroot
$ tar zxvf /path/to/Symfony_Standard_Vendors_2.0.0PR11.tgz
Thursday, May 12, 2011
Step 3: Run it!
http://localhost/Symfony/web/config.php
Thursday, May 12, 2011
Step 3: Run it!
• This page identifies any problems with your setup
• Fix them, then click “Configure your Symfony Application online” to continue
Thursday, May 12, 2011
Step 3: Configure it!
If you’re into GUI’s, Symfony offers one for setting up your
basic configuration
Thursday, May 12, 2011
Finished!
This *is* your first Symfony2
page
Thursday, May 12, 2011
Act 4:
Let’s create some pages
Thursday, May 12, 2011
The 3 Steps to a Page
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
/hello/ryan
<h1>Hello ryan!</h1>
the request!
the response!
the edge of a giant flower!
Thursday, May 12, 2011
• Our goal: to create a hello world-like app
• in two small steps...
Hello {insert-name}!
Thursday, May 12, 2011
Step1: Define a route
_welcome: pattern: / defaults: { _controller: AcmeDemoBundle:Welcome:index }/
You define the routes (URLs) of your app
/hello/ryanhello_demo: pattern: /hello/{name} defaults: { _controller: AcmeDemoBundle:Meetup:hello }
Thursday, May 12, 2011
Add the following route toapp/config/routing.yml
** Routes can also be defined in XML, PHP and as annotations
hello_demo: pattern: /hello/{name} defaults: { _controller: AcmeDemoBundle:Meetup:hello }
Step1: Define a route
Thursday, May 12, 2011
hello_demo: pattern: /hello/{name} defaults: { _controller: AcmeDemoBundle:Meetup:hello }
Step 2: Symfony executes the controller of the route
AcmeDemoBundle:Meetup:hello
is a shortcut for
Acme\DemoBundle\Controller\MeetupController::helloAction()
Symfony executes this PHP method
Thursday, May 12, 2011
Step2: Create the controller<?php// src/Acme/DemoBundle/Controller/MeetupController.phpnamespace Acme\DemoBundle\Controller;
use Symfony\Component\HttpFoundation\Response;use Symfony\Bundle\FrameworkBundle\Controller\Controller;
class MeetupController extends Controller{ public function helloAction($name) { return new Response('Hello '.$name); }}
Thursday, May 12, 2011
Step2: Create the controller<?php// src/Acme/DemoBundle/Controller/MeetupController.phpnamespace Acme\DemoBundle\Controller;
use Symfony\Component\HttpFoundation\Response;use Symfony\Bundle\FrameworkBundle\Controller\Controller;
class MeetupController extends Controller{ public function helloAction($name) { return new Response('Hello '.$name); }}
OMG - no base controller class required!
Thursday, May 12, 2011
use Symfony\Component\HttpFoundation\Response;
public function helloAction($name){ return new Response('Hello '.$name);}
The Controller returns a Symfony Response object
This is where *your* code goes
Returning a Response object is the only requirement of a controller
Thursday, May 12, 2011
use Symfony\Component\HttpFoundation\Response;
public function helloAction($name){ return new Response('Hello '.$name);}
Routing Placeholders
hello_demo: pattern: /hello/{name} defaults: { _controller: AcmeDemoBundle:Meetup:hello }
The route matches URLs like /hello/*
And gives you access to the {name} value
Thursday, May 12, 2011
It’s Alive!
http://localhost/Symfony/web/app_dev.php/hello/ryan
Thursday, May 12, 2011
2 steps to a page
• Create a route that points to a controller
• Do anything you want inside the controller, but eventually return a Response object
Thursday, May 12, 2011
That was easy... what are some other tools I can choose
to use?
Thursday, May 12, 2011
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
Thursday, May 12, 2011
Render a template in the controller
public function helloAction($name){ $content = $this->renderView( 'AcmeDemoBundle:Meetup:hello.html.twig', array('name' => $name) ); return new Response($content);}
Do It!
Thursday, May 12, 2011
Do it!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 regularPHP templates
Thursday, May 12, 2011
It’s Still Alive!
http://localhost/Symfony/web/app_dev.php/hello/ryan
Thursday, May 12, 2011
Twig knows all kinds of tricks
• Learn more about Twig:
“Hands on Symfony2” on Slideshare http://bit.ly/hands-on-symfony2
“Being Dangerous with Twig” on Slideshare http://bit.ly/dangerous-with-twig
Official Documentation http://www.twig-project.org
Thursday, May 12, 2011
Act 5:
Shortcuts via Annotations
Thursday, May 12, 2011
The optional FrameworkExtraBundle lets you use annotations to do
less work
Thursday, May 12, 2011
Put the route right on your controller
/** * @extra:Route("/hello/{name}", name="hello_demo") */public function helloAction($name){$content = $this->renderView( 'AcmeDemoBundle:Meetup:hello.html.twig', array('name' => $name)); return new Response($content);}
Thursday, May 12, 2011
Put the route right on your controller
/** * @extra:Route("/hello/{name}", name="hello_demo") */public function helloAction($name){$content = $this->renderView( 'AcmeDemoBundle:Meetup:hello.html.twig', array('name' => $name)); return new Response($content);}
The PHP comments are called “annotations”
Symfony can use annotations to read routing config
Your route and controller are in the same place!
Thursday, May 12, 2011
Instead of rendering a 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);}
Thursday, May 12, 2011
Controller: AcmeDemoBundle:Meetup:hello
Template: AcmeDemoBundle:Meetup:hello.html.twig
/** * @extra:Route("/hello/{name}", name="hello_demo") * @extra:Template() */public function helloAction($name){ return array('name' => $name);}
Thursday, May 12, 2011
If you choose to follow conventions, you can take
advantage of certain shortcuts
Thursday, May 12, 2011
Add security
/** * @extra:Route("/hello/admin/{name}") * @extra:Secure(roles="ROLE_ADMIN") * @extra:Template() */public function helloAdminAction($name){ return array('name' => $name);}
Thursday, May 12, 2011
Add caching
/** * @extra:Route("/hello/{name}) * @extra:Template() * @extra:Cache(maxage="86400") */public function helloAction($name){ return array('name' => $name);}
Thursday, May 12, 2011
Act 5:
The Killer Features of Symfony2
Thursday, May 12, 2011
#1 Crazy-Decoupled & Extensible
• Composed of nearly 30 independent libraries
• Your code has as many rights as the core code
• Heavy use of the observer pattern (i.e. events)
• Standards Compliant (e.g. PSR-0)
Thursday, May 12, 2011
#2 The Developer Experience
• You’re in the driver’s seat, not the framework
• Great effort has gone into expressive exception messages at every potential pain point
• The Web Debug Toolbar and Profiler
Thursday, May 12, 2011
The web debug toolbar
Thursday, May 12, 2011
The Profiler
Thursday, May 12, 2011
#3 HTTP Caching
• Instead of inventing a caching strategy, Symfony uses the HTTP Cache specification
public function helloAction($name){ $response = // ... $response->setMaxAge(86400);
return $response;}
Thursday, May 12, 2011
#3 HTTP Caching
• Symfony2 ships with a reverse proxy built in pure PHP
• Swap it out for Varnish, Squid or another other HTTP cache
• Native support for edge side includes (ESI)
Thursday, May 12, 2011
#4 The Security Component
• Based on the Security Component of the Spring Framework
• Firewalls can authenticate users via any method: HTTP Auth, X.509 certificate, form login, Twitter, etc, etc
• Framework for advanced ACLs via Doctrine
Thursday, May 12, 2011
#5 Silex: The Microframework
• Microframework built from Symfony2 Components
require_once __DIR__.'/silex.phar';
$app = new Silex\Application();
$app->get('/hello/{name}', function($name) { return "Hello $name"; });
$app->run();
http://silex-project.org/
• It’s just that easy
Thursday, May 12, 2011
#6 The hyperactive community
• 190+ core contributors
• 90+ documentation contributors
• 223 open source Symfony2 bundles
• 74 open source Symfony2 projects
... and counting ...
Thursday, May 12, 2011
Symfony2Bundles.org
• 223 open source bundles• 74 open source projects
http://symfony2bundles.org/
Thursday, May 12, 2011
And lot’s more
• Cache-warming framework
• Routing can be dumped as Apache rewrite rules
• Service container can be dumped to Graphviz
• RESTful APIS support via the RestBundle
https://github.com/FriendsOfSymfony/RestBundle
Thursday, May 12, 2011
After-Dinner Mint
Standalone PHP Libraries from the Symfony Community
Thursday, May 12, 2011
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
https://github.com/kriswallsmith/assetic
Thursday, May 12, 2011
Behat + Mink
• Behavioral-driven development framework
http://behat.org/
• Write human-readable sentences that test your code (and can be run in a browser)
Thursday, May 12, 2011
Gaufrette
• PHP filesystem abstraction library
• Read and write from Amazon S3 or FTP like a local filesystem
https://github.com/knplabs/Gaufrette
// ... setup your filesystem
$content = $filesystem->read('myFile');$content = 'Hello I am the new content';
$filesystem->write('myFile', $content);
Thursday, May 12, 2011
Imagine
• PHP Image manipulation library
• Does crazy things and has crazy docs
use Imagine\Image\Box;use Imagine\Image\Point;
$image->resize(new Box(15, 25)) ->rotate(45) ->crop(new Point(0, 0), new Box(45, 45)) ->save('/path/to/new/image.jpg');
https://github.com/avalanche123/Imagine
Thursday, May 12, 2011
Deployment with Capifony
• Capistrano deployment for symfony1 and Symfony2
http://capifony.org/
$ cap deploy:setup $ cap deploy $ cap deploy:rollback
Thursday, May 12, 2011
The RestBundle
• For a fully-featured RESTful API solution try out the RestBundle
• Provides a view layer to enable format agnostic controllers
https://github.com/FriendsOfSymfony/RestBundle
Thursday, May 12, 2011
And early support from a few big names
Thursday, May 12, 2011
PhpStorm
• PHP IDE now supports Twig Templates
http://www.jetbrains.com/phpstorm/
Thursday, May 12, 2011
Support for Orchestra
• Orchestra is a PHP platform for deploying, scaling and managing your PHP applications.
• They’re awesome...
• And they support Symfony2!
http://orchestra.io/
https://orchestra.tenderapp.com/kb/frameworks/symfony2
Thursday, May 12, 2011
Last words
Thursday, May 12, 2011
Symfony2 is...
• Fast as hell• Infinitely flexible• Fully-featured• Driven by a huge community
• Not released yet...Currently at beta1
Thursday, May 12, 2011
Backwards Compatibility breaks are possible, but will be
well-documented
Thursday, May 12, 2011
So dive in!
Thursday, May 12, 2011
Thanks!Questions?
Symfony2 Trainingin Nashville
Join us May 19th & 20th
Ryan Weaver@weaverryan
Thursday, May 12, 2011
Who is this dude?
• Co-author of the Symfony2 Docs
• Core Symfony2 contributor
• Founder of KnpLabs US
• Big geek
http://www.twitter.com/weaverryanhttp://www.github.com/weaverryan
Thursday, May 12, 2011
Quality. Innovation. Excitement.
• symfony/Symfony2 development
• Consulting & application auditing
• Symfony2 Training
KnpLabs
Thursday, May 12, 2011
• 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 is in New York City: June 6th & 7th
Symfony2 Training
http://bit.ly/symfony-training
Thursday, May 12, 2011