Domain-driven Design in PHP and Symfony - Drupal Camp Wroclaw!
symfony: An Open-Source Framework for Professionals (PHP Day 2008)
-
Upload
fabien-potencier -
Category
Technology
-
view
4.443 -
download
2
description
Transcript of symfony: An Open-Source Framework for Professionals (PHP Day 2008)
![Page 1: symfony: An Open-Source Framework for Professionals (PHP Day 2008)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/1.jpg)
www.sensiolabs.com
Fabien Potencier
symfony An Open-Source Framework
for Professionals
![Page 2: symfony: An Open-Source Framework for Professionals (PHP Day 2008)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/2.jpg)
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)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/3.jpg)
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)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/4.jpg)
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)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/5.jpg)
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)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/6.jpg)
www.sensiolabs.com
Framework
![Page 7: symfony: An Open-Source Framework for Professionals (PHP Day 2008)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/7.jpg)
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)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/8.jpg)
www.sensiolabs.com
Maintainability & Evolutivity
![Page 9: symfony: An Open-Source Framework for Professionals (PHP Day 2008)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/9.jpg)
www.sensiolabs.com
Structure & Standardisation
![Page 10: symfony: An Open-Source Framework for Professionals (PHP Day 2008)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/10.jpg)
www.sensiolabs.com
MVC
![Page 11: symfony: An Open-Source Framework for Professionals (PHP Day 2008)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/11.jpg)
www.sensiolabs.com
Model
![Page 12: symfony: An Open-Source Framework for Professionals (PHP Day 2008)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/12.jpg)
www.sensiolabs.com
View
![Page 13: symfony: An Open-Source Framework for Professionals (PHP Day 2008)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/13.jpg)
www.sensiolabs.com
Controller
![Page 14: symfony: An Open-Source Framework for Professionals (PHP Day 2008)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/14.jpg)
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)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/15.jpg)
www.sensiolabs.com
Develop Faster & Better
![Page 16: symfony: An Open-Source Framework for Professionals (PHP Day 2008)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/16.jpg)
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)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/17.jpg)
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)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/18.jpg)
www.sensiolabs.com
symfony
![Page 19: symfony: An Open-Source Framework for Professionals (PHP Day 2008)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/19.jpg)
www.sensiolabs.com
An Open-Source Framework
![Page 20: symfony: An Open-Source Framework for Professionals (PHP Day 2008)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/20.jpg)
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)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/21.jpg)
www.sensiolabs.com
An Open-Source Documentation
![Page 22: symfony: An Open-Source Framework for Professionals (PHP Day 2008)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/22.jpg)
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)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/23.jpg)
www.sensiolabs.com
![Page 24: symfony: An Open-Source Framework for Professionals (PHP Day 2008)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/24.jpg)
www.sensiolabs.com
A great Community
![Page 25: symfony: An Open-Source Framework for Professionals (PHP Day 2008)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/25.jpg)
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)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/26.jpg)
www.sensiolabs.com
« Entreprise » Version
![Page 27: symfony: An Open-Source Framework for Professionals (PHP Day 2008)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/27.jpg)
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)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/28.jpg)
www.sensiolabs.com
Let’s start a Project
![Page 29: symfony: An Open-Source Framework for Professionals (PHP Day 2008)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/29.jpg)
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)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/30.jpg)
www.sensiolabs.com
List of recent posts
Categories Post information
Excerpt
![Page 31: symfony: An Open-Source Framework for Professionals (PHP Day 2008)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/31.jpg)
www.sensiolabs.com
Sidebar customization
Add a comment
List of comments
![Page 32: symfony: An Open-Source Framework for Professionals (PHP Day 2008)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/32.jpg)
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)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/33.jpg)
www.sensiolabs.com
Project Initialization
![Page 34: symfony: An Open-Source Framework for Professionals (PHP Day 2008)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/34.jpg)
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)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/35.jpg)
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)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/36.jpg)
www.sensiolabs.com
symfony CLI $ symfony
![Page 37: symfony: An Open-Source Framework for Professionals (PHP Day 2008)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/37.jpg)
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)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/38.jpg)
www.sensiolabs.com
Create a new Application ./symfony help generate:app
![Page 39: symfony: An Open-Source Framework for Professionals (PHP Day 2008)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/39.jpg)
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)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/40.jpg)
www.sensiolabs.com
Project, Application, Module, Action
![Page 41: symfony: An Open-Source Framework for Professionals (PHP Day 2008)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/41.jpg)
www.sensiolabs.com
Which symfony Version?
./symfony -V
config/ProjectConfiguration.class.php
![Page 42: symfony: An Open-Source Framework for Professionals (PHP Day 2008)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/42.jpg)
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)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/43.jpg)
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)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/44.jpg)
www.sensiolabs.com
Environments
![Page 45: symfony: An Open-Source Framework for Professionals (PHP Day 2008)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/45.jpg)
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)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/46.jpg)
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)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/47.jpg)
www.sensiolabs.com
Try a 404 dev environment
prod environment
![Page 48: symfony: An Open-Source Framework for Professionals (PHP Day 2008)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/48.jpg)
www.sensiolabs.com
Front Controllers dev environment
prod environment
environment
environment
![Page 49: symfony: An Open-Source Framework for Professionals (PHP Day 2008)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/49.jpg)
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)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/50.jpg)
www.sensiolabs.com
Web Debug Toolbar
Web debug toolbar
![Page 51: symfony: An Open-Source Framework for Professionals (PHP Day 2008)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/51.jpg)
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)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/52.jpg)
www.sensiolabs.com
Project, Application, Module, Action
![Page 53: symfony: An Open-Source Framework for Professionals (PHP Day 2008)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/53.jpg)
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)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/54.jpg)
www.sensiolabs.com
Browse
/frontend_dev.php/post/index
![Page 55: symfony: An Open-Source Framework for Professionals (PHP Day 2008)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/55.jpg)
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)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/56.jpg)
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)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/57.jpg)
www.sensiolabs.com
Project, Application, Module, Action
![Page 58: symfony: An Open-Source Framework for Professionals (PHP Day 2008)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/58.jpg)
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)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/59.jpg)
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)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/60.jpg)
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)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/61.jpg)
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)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/62.jpg)
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)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/63.jpg)
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)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/64.jpg)
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)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/65.jpg)
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)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/66.jpg)
www.sensiolabs.com
Make the Counter dynamic
![Page 67: symfony: An Open-Source Framework for Professionals (PHP Day 2008)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/67.jpg)
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)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/68.jpg)
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)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/69.jpg)
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)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/70.jpg)
www.sensiolabs.com
Database Schema config/schema.yml
![Page 71: symfony: An Open-Source Framework for Professionals (PHP Day 2008)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/71.jpg)
www.sensiolabs.com
Build the Model Classes ./symfony propel:build-model
![Page 72: symfony: An Open-Source Framework for Professionals (PHP Day 2008)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/72.jpg)
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)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/73.jpg)
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)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/74.jpg)
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)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/75.jpg)
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)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/76.jpg)
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)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/77.jpg)
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)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/78.jpg)
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)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/79.jpg)
www.sensiolabs.com
Load Data
$ ./symfony propel:data-load frontend
![Page 80: symfony: An Open-Source Framework for Professionals (PHP Day 2008)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/80.jpg)
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)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/81.jpg)
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)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/82.jpg)
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)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/83.jpg)
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)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/84.jpg)
www.sensiolabs.com
Get the Posts from the Database
![Page 85: symfony: An Open-Source Framework for Professionals (PHP Day 2008)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/85.jpg)
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)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/86.jpg)
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)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/87.jpg)
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)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/88.jpg)
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)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/89.jpg)
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)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/90.jpg)
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)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/91.jpg)
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)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/92.jpg)
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)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/93.jpg)
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)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/94.jpg)
www.sensiolabs.com
Link to the Homepage
![Page 95: symfony: An Open-Source Framework for Professionals (PHP Day 2008)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/95.jpg)
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)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/96.jpg)
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)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/97.jpg)
www.sensiolabs.com
Comment Form
$ ./symfony propel:build-forms
![Page 98: symfony: An Open-Source Framework for Professionals (PHP Day 2008)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/98.jpg)
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)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/99.jpg)
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)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/100.jpg)
www.sensiolabs.com
Create a Comment Form
![Page 101: symfony: An Open-Source Framework for Professionals (PHP Day 2008)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/101.jpg)
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)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/102.jpg)
www.sensiolabs.com
Bind The Form to the Post
![Page 103: symfony: An Open-Source Framework for Professionals (PHP Day 2008)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/103.jpg)
www.sensiolabs.com
Customize the Form lib/form/CommentForm.class.php
![Page 104: symfony: An Open-Source Framework for Professionals (PHP Day 2008)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/104.jpg)
www.sensiolabs.com
Form Life Cycle
![Page 105: symfony: An Open-Source Framework for Professionals (PHP Day 2008)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/105.jpg)
www.sensiolabs.com
Comments
![Page 106: symfony: An Open-Source Framework for Professionals (PHP Day 2008)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/106.jpg)
www.sensiolabs.com
Security: XSS
![Page 107: symfony: An Open-Source Framework for Professionals (PHP Day 2008)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/107.jpg)
www.sensiolabs.com
Security: CSRF
![Page 108: symfony: An Open-Source Framework for Professionals (PHP Day 2008)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/108.jpg)
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)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/109.jpg)
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)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/110.jpg)
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)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/111.jpg)
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)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/112.jpg)
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)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/113.jpg)
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)](https://reader033.fdocuments.us/reader033/viewer/2022051110/54b772ff4a795985568b4635/html5/thumbnails/114.jpg)
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
http://www.sensiolabs.com/ http://www.symfony-project.com/