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.
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
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 ...
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
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
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
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
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);
}
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
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