symfony: an open-source framework for professionals (php day 2008)

114
Fabien Potencier symfony An Open-Source Framework for Professionals

Upload: fabien-potencier

Post on 15-Jan-2015

4.451 views

Category:

Technology


2 download

DESCRIPTION

 

TRANSCRIPT

Page 1: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

Fabien Potencier

symfony An Open-Source Framework

for Professionals

Page 2: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

Before we begin

How many have already used symfony for a project,

even a very small personal project?

Page 3: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

Before we begin

Do you want to do the exercices on your laptop?

Page 4: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

Sensio • Sensio

– Web Agency – Founded in 1998 – 45 people dedicated to Web dev.

• Open-Source Specialists

• Big corporate customers

Webmarketing Internet Technologies

Sensio Web Agency

symfony framework creator

Page 5: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

symfony • PHP Web framework • Based on

– 10 years of Sensio experience – Existing Open-Source projects

• Built for : – Professional websites – Complex needs – Demanding environments

Page 6: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

Framework

Page 7: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

Whatever the application, a framework is build to ease

development by providing tools for recurrent and boring tasks.

Page 8: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

Maintainability & Evolutivity

Page 9: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

Structure & Standardisation

Page 10: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

MVC

Page 11: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

Model

Page 12: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

View

Page 13: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

Controller

Page 14: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

Internet

Controleur

Vue

2

Modèle

BDD

3

4

5

6

1

Page 15: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

Develop Faster & Better

Page 16: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

Write less code

More time for edge cases, business rules, …

less code

less complexity

less bugs

more productivity

more time

Page 17: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

Each line of code has an initial cost

… and there is a cost to maintain the line

Kent Beck (based on Yourdon and Constantine)

Costinitial = Costdeveloppement + Costtests

Costmaintenance >> Costinitial

Costmaintenance = Costunderstanding + Costchange + Costtests + Costdeployment

Page 18: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

symfony

Page 19: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

An Open-Source Framework

Page 20: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

MIT Licence

« It is a permissive license, meaning that it permits

reuse within proprietary software on the condition

that the license is distributed with that software. »

Page 21: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

An Open-Source Documentation

Page 22: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

• Open-Source documentation – The book (450 pages - GFDL) – Askeet Tutorial (250 pages)

• Translation in 12 langages –  中文 (Chinese)

– Deutsch – Español – Français –  Italiano –  日本語 (Japanese)

–  Polski –  Português –  Russian –  Ukrainian –  Čeština –  Nederlands

Page 23: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

Page 24: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

A great Community

Page 25: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

Mailing-list support / forums / IRC

240 available plugins

300k unique visitors per month on the official website www.symfony-project.org

Page 26: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

« Entreprise » Version

Page 27: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

Version 1.0 released early 2007

Maintained for 3 ans (early 2010)

~1 release a month (1.0.16 now)

Bugs and security fixes, compatibility with upcoming PHP versions

No new features

Upgrading is simple and safe

Page 28: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

Let’s start a Project

Page 29: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

The Project • A simple blog system

– Posts – Categories – Authors – Comments

• Requirements – Maintainable – Customizable – Secure

• Use symfony 1.1

Page 30: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

List of recent posts

Categories Post information

Excerpt

Page 31: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

Sidebar customization

Add a comment

List of comments

Page 32: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

Famfamfam icons

YUI stylesheets

homepage

post

http://www.symfony-project.org/get/design.tgz

Page 33: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

Project Initialization

Page 34: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

Bootstrap a symfony Project

1.  Install symfony

2.  Initialize a new project

3.  Configure the Web Server

4.  Start coding

Page 35: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

Installing symfony

Sandbox: Ready-to-run symfony application

PEAR: Install symfony globally on your machine

Subversion: Be free to have several versions around

Page 36: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

symfony CLI $ symfony

Page 37: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

Create a new Project

$ mkdir blog

$ cd blog

$ symfony generate:project blog

Page 38: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

Create a new Application ./symfony help generate:app

Page 39: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

Create a new secure Application

./symfony generate:app frontend \

--escaping-strategy=on \

--csrf-secret=A$ecret

Page 40: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

Project, Application, Module, Action

Page 41: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

Which symfony Version?

./symfony -V

config/ProjectConfiguration.class.php

Page 42: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

Configure the Web Server <VirtualHost *:80> ServerName myapp.example.com DocumentRoot "/path/to/blog/web" DirectoryIndex index.php

<Directory "/path/to/blog/web"> AllowOverride All Allow from All </Directory>

</VirtualHost>

Web root directory is web/

Page 43: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

symfony Assets Used by the default pages and the Web Debug Toolbar

Configure the Web Server to serve symfony assets

Or, create a symlink

<VirtualHost *:80> … Alias /sf /$sf_symfony_data_dir/web/sf <Directory "/$sf_symfony_data_dir/web/sf"> AllowOverride All Allow from All </Directory> </VirtualHost>

$ cd web/

$ ln -sf ../lib/vendor/symfony/data/web/sf sf

Page 44: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

Environments

Page 45: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

developers customers end users

development environment

staging environment

production environment

Page 46: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

cache cache cache

debug debug debug

logs logs

stats stats stats

logs

development environment

staging environment

production environment

Page 47: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

Try a 404 dev environment

prod environment

Page 48: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

Front Controllers dev environment

prod environment

environment

environment

Page 49: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

Environment Configuration apps/frontend/config/settings.yml

Web debug toolbar

environment

Page 50: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

Web Debug Toolbar

Web debug toolbar

Page 51: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

Create a Module for Posts Create a new ‘post’ module in the ‘frontend’

application

$ php symfony generate:module frontend post

Page 52: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

Project, Application, Module, Action

Page 53: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

Action and Template Naming /frontend_dev.php/blog/index

// in apps/frontend/modules/blog/actions/actions.class.php <?php

class blogActions extends sfActions { public function executeIndex() { // do things } }

// in apps/frontend/modules/blog/templates/indexSuccess.php <!–- do things -->

module action

Page 54: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

Browse

/frontend_dev.php/post/index

Page 55: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

Create the Blog Homepage

• Copy homepage.html into indexSuccess.php • Copy the images/ and css/ under web/ • Add the base.css CSS in view.yml • Fix images and css paths

apps/frontend/modules/post/templates/indexSuccess.php

/frontend_dev.php/post/index

Page 56: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

Create an Action to show a Post apps/frontend/modules/post/actions/actions.class.php

/frontend_dev.php/post/show

• Create an empy executeShow() action • Copy post.html into showSuccess.php • Fix images and css paths

Page 57: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

Project, Application, Module, Action

Page 58: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

Extract common Code

Homepage specific content

Post page specific content

Page 59: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

The Layout

header.php

page content

footer.php

page content

layout.php

include

include

decoration

A layout wraps the template content

Page 60: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

The Layout Move the common code from homepage and post to

the layout

apps/frontend/templates/layout.php

Page 61: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

Customize the Sidebar and the Title The title depends on the page

The sidebar depends on the page

Page 62: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

Layout with Several "holes"

Main content

Main content

+ =

Layout Template with slots

Rendered Page

Slot1

Slot

2

Slot 1

Slot 2

A slot content depends on the template context

Page 63: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

Create Slots for Title and Sidebar apps/frontend/templates/layout.php

Page 64: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

Fill the Slots

apps/frontend/modules/blog/templates/showSuccess.php

Page 65: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

Passing Data from Action to Template

apps/frontend/modules/blog/actions/actions.class.php

apps/frontend/modules/blog/templates/indexSuccess.php

Page 66: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

Make the Counter dynamic

Page 67: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

Database Schema

A post has an author

A post can be in a category

A post can have comments

Page 68: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

Propel : The symfony ORM ORM = Object-Relational Mapping Mapping a relational database to an object-oriented

model Database Abstraction

table row, record field, column

class object proterty

Object-Oriented Relational

Page 69: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

Schema Conventions post: id: # primary key, autoincrement integer author_id: # foreign key to Author created_at: # timestamp, set to current time on creation updated_at: # timestamp, set to current time on update

# column types published_at: timestamp title: varchar(255) content: longvarchar is_spam: boolean

# complex column definitions last_name: { type: varchar(100), index: true, required: true } category_id: { type: integer, foreignTable: category,

foreignReference: id, required: false, onDelete: setnull }

Page 70: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

Database Schema config/schema.yml

Page 71: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

Build the Model Classes ./symfony propel:build-model

Page 72: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

From Schema to Object Model

$ ./symfony propel:build-model

lib/ model/ om/ BasePost.php BasePostPeer.php Post.php PostPeer.php

propel: post: id: ~ name: varchar(255)

1 table > 4 classes?

Page 73: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

Base and Custom Classes Base classes

Under model/om/, prefixed by Base Generated by Propel Overwritten each time the schema

changes and the model is generated Never edit these files!

lib/ model/ om/ BasePost.php BasePostPeer.php Post.php PostPeer.php

lib/ model/ om/ BasePost.php BasePostPeer.php Post.php PostPeer.php

Custom classes Under model/, no prefix Inherit from Base classes Never overwritten Put custom methods here Override base methods here

Page 74: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

Peer and Object Classes Peer classes

Suffixed by Peer Useful to retrieve a collection of objects Methods return objects Only static methods (::, self)

lib/ model/ om/ BasePost.php BasePostPeer.php Post.php PostPeer.php

Object classes No suffix Useful to create / inspect / update records Methods return column values Only object methods (->, $this)

lib/ model/ om/ BasePost.php BasePostPeer.php Post.php PostPeer.php

Page 75: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

Database Initialization

mysqladmin create phpday

./symfony configure:database mysql://localhost/phpday

Page 76: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

Build the SQL queries ./symfony propel:build-sql

./symfony propel:insert-sql

Page 77: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

Shortcut for all the previous Tasks

./symfony propel:build-all

Page 78: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

Initial Data data/fixtures/01-data.yml

Define PKs with names

Use names instead of Pks

Dynamic values

Page 79: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

Load Data

$ ./symfony propel:data-load frontend

Page 80: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

Summary of Code Generation

schema.yml

Object model Base, Custom, Peer and object classes

Relational database Tables, columns, keys, indexes

propel:build-model

propel:build-sql propel:insert-sql

1

2

3

Page 81: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

If the Database preexists the Project

schema.yml

Object model Base, Custom, Peer and object classes

Relational database Tables, columns, keys, indexes

propel:build-model

propel:build-schema

2

3

1

Page 82: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

Generated Methods of Object Classes

Getter for columns $title = $post->getTitle(); $content = $post->getContent(); $createdAt = $post->getCreatedAt();

Some getters have special options $date = $post->getCreatedAt($dateFormat);

Getter by name $title = $post->getByName('title');

CamelCase version of the column name

Page 83: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

Generated Methods of Object Classes Manipulate primary keys

$commentId = $comment->getId(); // for composite keys, prefer $commentId = $comment->getPrimaryKey();

Manipulate foreign keys $postId = $comment->getPostId(); // in practice, these methods are not used much // use getter for foreign objects instead $post = $comment->getPost(); // Post object // as the result is an object, you can chain method calls $content = $comment->getPost()->getContent();

One-to-Many smart getters $comments = $post->getCommments(); // Array of Comments $nb = $post->countCommments(); // Integer

Page 84: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

Get the Posts from the Database

Page 85: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

What the Model Layer does Action Model Database

PostPeer::doSelect(new Criteria())

SELECT * FROM post

Criteria to SQL translation

resultset Query execution

Array of Post objects Object hydrating

Page 86: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

What the Model Layer does Template Model Database

$post->getTitle()

String Looking up internal attribute

Page 87: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

Make the Post show Page dynamic

/frontend_dev.php/post/show?id=1

Page 88: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

Make the Post show Page dynamic

Display a 404 error if the post does not exist

Page 89: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

Change the Date Format getPublishedAt() first argument accepts the date()

format or the strftime() format

symfony format_date() helper is i18n aware

Page 90: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

Helper Groups • Tag • URLs • Assets (images, JavaScript, CSS, …) • Subtemplate inclusion (slot, partial, component) • Links • Form •  Javascript and Ajax • Text, number, date manipulation •  I18N • …

Page 91: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

Permalinks • Many applications provide an alternative to

functional URLs • Permalinks look like links to permanent content

while the resource they reference is dynamically generated

• Primarily focused at search engines, permalink often carry more readable data for end users

http://www.symfony-project.org/blog/2008/05/21/new-symfony-security-policy

Page 92: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

Links to the Post Page apps/frontend/config/routing.yml

lib/model/Post.php

Page 93: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

Links to the Post Page

apps/frontend/modules/post/templates/indexSuccess.php

apps/frontend/modules/post/actions/actions.class.php

Page 94: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

Link to the Homepage

Page 95: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

Add the Comments

apps/frontend/modules/post/templates/showSuccess.php

Page 96: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

What the Model Layer does Template Model Database

$post->getComments()

SELECT * FROM comment WHERE comment.post_id= ?

resultset Query execution

Array of Comment objects Object hydrating

Page 97: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

Comment Form

$ ./symfony propel:build-forms

Page 98: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

Base and Custom Classes Base classes

Under form/base/, prefixed by Base Generated by symfony Overwritten when the schema

changes and the forms are generated

Never edit these files!

lib/ form/ base/ BasePostForm.class.php PostForm.class.php

lib/ form/ base/ BasePost.Form.class.php PostForm.class.php

Custom classes Under form/, no prefix Inherit from Base classes Never overwritten Put custom methods here Override base methods here

Page 99: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

Create a Comment Form

apps/frontend/modules/post/actions/actions.class.php

apps/frontend/modules/post/templates/showSuccess.php

Page 100: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

Create a Comment Form

Page 101: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

Propel Forms • Generated by propel:build-forms • 1 table = 1 form • Model introspection to determine

– The widget – The validation rules

• Automatically converts a form to a Propel object and save it to the database

• Extensible

Page 102: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

Bind The Form to the Post

Page 103: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

Customize the Form lib/form/CommentForm.class.php

Page 104: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

Form Life Cycle

Page 105: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

Comments

Page 106: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

Security: XSS

Page 107: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

Security: CSRF

Page 108: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

Create the Category Page lib/model/PostPeer.class.php

apps/frontend/modules/blog/actions/actions.class.php

Page 109: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

Create the Category Page

apps/frontend/config/routing.yml

apps/frontend/templates/layout.php

Page 110: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

Create a Partial for the List apps/frontend/modules/blog/templates/_list.php

apps/frontend/modules/blog/templates/listByCategorySuccess.php

Page 111: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

Create a Component

apps/frontend/templates/layout.php

apps/frontend/modules/post/actions/components.class.php

apps/frontend/modules/post/templates/_categories.php

Page 112: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

Create a Web Service for Posts

apps/frontend/config/routing.yml

apps/frontend/modules/post/templates/indexSuccess.xml.php

Page 113: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

If we have time… • Functional Tests

• Cache

• CRUD to manage posts

Page 114: symfony: An Open-Source Framework for Professionals (PHP Day 2008)

www.sensiolabs.com

Sensio S.A. 26, rue Salomon de Rothschild

92 286 Suresnes Cedex FRANCE

Tél. : +33 1 40 99 80 80 Fax : +33 1 40 99 83 34

Contact Fabien Potencier

[email protected]

http://www.sensiolabs.com/ http://www.symfony-project.com/