Hands-on with the Symfony2 Framework

Post on 06-May-2015

18.655 views 0 download

description

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.

Transcript of Hands-on with the Symfony2 Framework

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

Quality. Innovation. Excitement.

• Your symfony/Symfony2 development experts

• Consulting & application auditing

• Symfony2 Training

• Behind lots of open source initiatives

KnpLabs

• 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

Act 1:

Meet Symfony

Symfony is a PHP Framework, a Philosophy, and

a Community - all working together in harmony.

symfony.com/what-is-symfony

What is Symfony2?

• 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

• 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

Act 2:

Why Symfony2?

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

“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

“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

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/

• 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

Act 3:

Dive into Symfony

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

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

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

• Then click “Configure your Symfony Application online”

Tend to your Garden

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

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>

• 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}!

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 }

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 }

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

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

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

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

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

HomeworkRender a template in the controller

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

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

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

header

sidebar content

A base layout file defines “blocks”

Each block can have a default value

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

header

sidebar contentand “overrides” the parent’s blocks

The child template “extends” the parent

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

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

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 yourapp/config/routing.yml

This now imports routing information from our controller

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

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!

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!

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

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

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 theSymfony Community

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

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

Behat + Mink

• Behavioral-driven development framework

http://behat.org/

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

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

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

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

Sonata Admin Bundle

• Admin generator for Symfony2

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

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!

Ryan Weaver@weaverryan

Questions?

Symfony2 Trainingin Nashville

Join us May 19th & 20th