Download - Hands-on with the Symfony2 Framework

Transcript
Page 1: Hands-on with the Symfony2 Framework

Hands on with Symfony2

Ryan Weaver@weaverryan

Page 2: Hands-on with the Symfony2 Framework

Who is this dude?

• Co-author of the Symfony2 Docs

• Core Symfony2 contributor

• Founder of KnpLabs US

• Geek, running, Nashville

http://www.twitter.com/weaverryanhttp://www.github.com/weaverryan

Page 3: Hands-on with the Symfony2 Framework

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

Page 4: Hands-on with the Symfony2 Framework

Quality. Innovation. Excitement.

• Your symfony/Symfony2 development experts

• Consulting & application auditing

• Symfony2 Training

• Behind lots of open source initiatives

KnpLabs

Page 5: Hands-on with the Symfony2 Framework

• 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

Symfony2 Training

http://bit.ly/symfony-training

Page 6: Hands-on with the Symfony2 Framework

Act 1:

Meet Symfony

Page 7: Hands-on with the Symfony2 Framework

Symfony is a PHP Framework, a Philosophy, and

a Community - all working together in harmony.

symfony.com/what-is-symfony

What is Symfony2?

Page 8: Hands-on with the Symfony2 Framework

• A group of standalone PHP components

• Bundled into a full-service framework

Symfony2

Solves your difficult, redundant problems

... and then stays the hell out of the way

Page 9: Hands-on with the Symfony2 Framework

• Data persistence(via Doctrine)

• Security• Forms• Validation• Templating• Autoloading• Logging

Problems Solved

• Asset Management• Routing• File+Dir Traversing• Translation• Dependency Injection• Image Manipulation• Console Tasks• Caching

Page 10: Hands-on with the Symfony2 Framework

Act 2:

Why Symfony2?

Page 11: Hands-on with the Symfony2 Framework

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 fast

Page 12: Hands-on with the Symfony2 Framework

“Symfony2 is an extremely full featured, modular, and

crazy fast framework.”

spf13.com/post/symfony2

Steve FranciaVice President of Engineering at OpenSky

Symfony2 is full-featured

Page 13: Hands-on with the Symfony2 Framework

“Symfony2 is probably one of the most flexible PHP frameworks ever

created. You can literally change everything.”

~ Blog.NewITFarmer.com

Infinitely Flexible Architecture

http://bit.ly/symfony-new-it-farmer

Page 14: Hands-on with the Symfony2 Framework

A huge community of developers

• 167 core contributors

• 87 documentation contributors

... and counting ...

Page 15: Hands-on with the Symfony2 Framework

A huge eco-system of open source libraries

• 223 open source Symfony2 bundles

• 74 open source Symfony2 projects

... and counting ...

Page 16: Hands-on with the Symfony2 Framework

Symfony2Bundles.org

• 223 open source bundles• 74 open source projects

http://symfony2bundles.org/

Page 17: Hands-on with the Symfony2 Framework

• 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

Proven Reputation

Page 18: Hands-on with the Symfony2 Framework

Act 3:

Dive into Symfony

Page 19: Hands-on with the Symfony2 Framework

• 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

The “Standard Distribution”

Page 20: Hands-on with the Symfony2 Framework

Step 1: Get it!

symfony.com/download

Page 21: Hands-on with the Symfony2 Framework

Step 2: Unzip it!

$ cd /path/to/webroot

$ tar zxvf /path/to/Symfony_Standard_Vendors_2.0.0PR11.tgz

Page 22: Hands-on with the Symfony2 Framework

Step 3: Run it!

http://localhost/Symfony/web/config.php

Page 23: Hands-on with the Symfony2 Framework

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

• Then click “Configure your Symfony Application online”

Tend to your Garden

Page 24: Hands-on with the Symfony2 Framework

Step 3: Configure it!

Optional: but a nice interface to get you started

quickly

Page 25: Hands-on with the Symfony2 Framework

Finished!

This *is* your first Symfony2

page

Page 26: Hands-on with the Symfony2 Framework

Act 4:

Let’s create some pages

Page 27: Hands-on with the Symfony2 Framework

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>

Page 28: Hands-on with the Symfony2 Framework

• 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...

Hello {insert-name}!

Page 29: Hands-on with the Symfony2 Framework

Step1: Symfony matches the URL to 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 }

Page 30: Hands-on with the Symfony2 Framework

Homework

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 }

Page 31: Hands-on with the Symfony2 Framework

hello_demo: pattern: /hello/{name} defaults: { _controller: AcmeDemoBundle:Meetup:hello }

Step2: Symfony executes the controller of the route

Controller Class::method()

Acme\DemoBundle\Controller\MeetupController::helloAction()

Symfony will execute this PHP method

Page 32: Hands-on with the Symfony2 Framework

HomeworkCreate the controller class:

<?php// src/Acme/DemoBundle/Controller/MeetupController.phpnamespace Acme\DemoBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;use Symfony\Component\HttpFoundation\Response;

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

Page 33: Hands-on with the Symfony2 Framework

use Symfony\Component\HttpFoundation\Response;

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

Step 3: The Controller returns a Symfony Response object

This is the only requirement of a controller

Page 34: Hands-on with the Symfony2 Framework

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

Page 35: Hands-on with the Symfony2 Framework

It’s Alive!

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

Page 36: Hands-on with the Symfony2 Framework

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

Page 37: Hands-on with the Symfony2 Framework

HomeworkRender a template in the controller

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

Page 38: Hands-on with the Symfony2 Framework

HomeworkCreate 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

Page 39: Hands-on with the Symfony2 Framework

It’s Still Alive!

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

Page 40: Hands-on with the Symfony2 Framework

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

Page 41: Hands-on with the Symfony2 Framework

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

Page 42: Hands-on with the Symfony2 Framework

header

sidebar content

A base layout file defines “blocks”

Each block can have a default value

{% block header %} <h1>Welcome!</h1>{% endblock %}

Page 43: Hands-on with the Symfony2 Framework

header

sidebar contentand “overrides” the parent’s blocks

The child template “extends” the parent

{% block header %} <h1>Super hello Welcome!</h1>{% endblock %}

Page 44: Hands-on with the Symfony2 Framework

HomeworkMake 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

Page 45: Hands-on with the Symfony2 Framework

It’s Beautiful!

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

Page 46: Hands-on with the Symfony2 Framework

Act 5:

Remove all the code

Page 47: Hands-on with the Symfony2 Framework

Do Less Work

• So far, we have:• a route• a controller• a template

• We can do all of this with even less code

Page 48: Hands-on with the Symfony2 Framework

Homework

Change yourapp/config/routing.yml

This now imports routing information from our controller

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

Page 49: Hands-on with the Symfony2 Framework

Homework

Add the route to your controller /** * @extra:Route("/hello/{name}", name="hello_demo") */ public function helloAction($name) { $response = $this->render( 'AcmeDemoBundle:Meetup:hello.html.twig', array('name' => $name) ); return $response; }

The PHP comments are called “annotations”

Symfony can use annotations to read routing config

Your route and controller are in the same place!

Page 50: Hands-on with the Symfony2 Framework

Annotations /** * @extra:Route("/hello/{name}", name="hello_demo") */ public function helloAction($name) { $response = $this->render( 'AcmeDemoBundle:Meetup:hello.html.twig', array('name' => $name) ); return $response; }

The PHP comments are

called “annotations”

Symfony can use annotations to read routing configYour route and controller are in the same place!

Page 51: Hands-on with the Symfony2 Framework

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

Page 52: Hands-on with the Symfony2 Framework

/** * @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

Page 53: Hands-on with the Symfony2 Framework

Now with less code!

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

Page 54: Hands-on with the Symfony2 Framework

Act 6:

JSON { name: “Ryan” }

Page 55: Hands-on with the Symfony2 Framework

Create a JSON API

• We have an HTML version of our page

• How about a JSON version?

Page 56: Hands-on with the Symfony2 Framework

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

Page 57: Hands-on with the Symfony2 Framework

Create a JSON template

“/hello/ryan.json” renders a JSON array

{# src/Acme/DemoBundle/Resources/views/Meetup/hello.json.twig #}

{% set arr = { 'name': name } %}

{{ arr | json_encode | raw }}

{"name":"ryan"}

It’s that simple

Page 58: Hands-on with the Symfony2 Framework

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)

Page 59: Hands-on with the Symfony2 Framework

RestBundle

• For a truly robust solution to RESTful API’s, see the community-driven RestBundle

https://github.com/FriendsOfSymfony/RestBundle

Page 60: Hands-on with the Symfony2 Framework

Act 7:

With annotations, you can

Page 61: Hands-on with the Symfony2 Framework

Add security

/** * @extra:Route("/hello/admin/{name}") * @extra:Secure(roles="ROLE_ADMIN") * @extra:Template() */public function helloadminAction($name){ return array('name' => $name);}

Page 62: Hands-on with the Symfony2 Framework

Add caching

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

Page 63: Hands-on with the Symfony2 Framework

Act 8:

PHP Libraries by theSymfony Community

Page 64: Hands-on with the Symfony2 Framework

Doctrine2http://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

Page 65: Hands-on with the Symfony2 Framework

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

Page 66: Hands-on with the Symfony2 Framework

Behat + Mink

• Behavioral-driven development framework

http://behat.org/

• Write human-readable sentences that test your code (and can be run in a browser)

Page 67: Hands-on with the Symfony2 Framework

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

Page 68: Hands-on with the Symfony2 Framework

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

Page 69: Hands-on with the Symfony2 Framework

Silex

• 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/

• That’s your whole app :)

Page 70: Hands-on with the Symfony2 Framework

Sonata Admin Bundle

• Admin generator for Symfony2

https://github.com/sonata-project/AdminBundle

Page 71: Hands-on with the Symfony2 Framework

Act 9:

Last words

Page 72: Hands-on with the Symfony2 Framework

Symfony2 is...

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

• Not released yet...Release candidate coming very soon...

Page 73: Hands-on with the Symfony2 Framework

Thanks!

Ryan Weaver@weaverryan

Questions?

Symfony2 Trainingin Nashville

Join us May 19th & 20th