Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Curso Symfony
Curso Symfony
Framework Symfony
Basado en The Definitive Guide to Symfony
Jordi Llonch
jordi@laigu.net
http://creativecommons.org/licenses/by-sa/3.0/
Symfony
Que es Symfony?
Proyecto, aplicacin y mdulo
Herramientas comunes
Instalar Symfony
Introduccin a la creacin de pginas
MVC
Controlador
Vista
Modelo
Que es Symfony?
Que es Symfony?
Un framework para construir aplicaciones web
con PHP.
Un enorme conjunto de herramientas y utilidades
que simplifican el desarrollo de las aplicaciones
web.
Curso Framework Symfony - Jordi Llonch <jordi@laigu.net>
Que es Symfony?
10
apps/
Descripcin
Contiene un directorio por cada aplicacin del proyecto (normalmente, frontend y backend para la parte
pblica y la parte de gestin respectivamente)
batch/
Contiene los scripts de PHP que se ejecutan mediante la lnea de comandos o mediante la programacin
de tareas para realizar procesos en lotes (batch processes)
cache/
Contiene la versin cacheada de la configuracin y (si est activada) la versin cacheada de las acciones y
plantillas del proyecto. El mecanismo de cache utiliza los archivos de este directorio para acelerar la
respuesta a las peticiones web. Cada aplicacin contiene un subdirectorio que guarda todos los archivos
PHP y HTML preprocesados
config/
data/
En este directorio se almacenan los archivos relacionados con los datos, como por ejemplo el esquema de
una base de datos, el archivo que contiene las instrucciones SQL para crear las tablas e incluso un archivo
de bases de datos de SQLite
doc/
Contiene la documentacin del proyecto, formada por tus propios documentos y por la documentacin
generada por PHPdoc
lib/
Almacena las clases y libreras externas. Se suele guardar todo el cdigo comn a todas las aplicaciones
del proyecto. El subdirectorio model/ guarda el modelo de objetos del proyecto
log/
Guarda todos los archivos de log generados por Symfony. Tambin se puede utilizar para guardar los logs
del servidor web, de la base de datos o de cualquier otro componente del proyecto. Symfony crea un
archivo de log por cada aplicacin y por cada entorno
plugins/
test/
Contiene las pruebas unitarias y funcionales escritas en PHP y compatibles con el framework de pruebas
de Symfony. Cuando se crea un proyecto, Symfony crea algunos pruebas bsicas
web/
La raz del servidor web. Los nicos archivos accesibles desde Internet son los que se encuentran en este
directorio
11
Directorio
apps/
[nombre aplicacion]/
config/
i18n/
lib/
modules/
templates/
layout.php
error.php
error.txt
Descripcin
config/
i18n/
lib/
modules/
12
apps/
[nombre aplicacion]/
modules/
[nombre modulo]/
actions/
actions.class.php
config/
lib/
templates/
indexSuccess.php
validate/
Directorio
Descripcin
actions/
config/
lib/
13
web/
css/
images/
js/
uploads/
Directorio
Descripcin
css/
images/
Contiene las imgenes del sitio con formato .jpg, .png o .gif
js/
uploads/
14
Herramientas comunes
Herramientas comunes
Contenedor de parmetros
Constantes (configuraciones)
16
Herramientas comunes
Contenedores de parmetros:
Herramientas comunes
Contenedores de parmetros:
class MiClase
{
protected $contenedor_parametros = null;
public function initialize ($parametros = array())
{
$this->contenedor_parametros = new sfParameterHolder();
$this->contenedor_parametros->add($parametros);
}
18
Herramientas comunes
Constantes (configuraciones):
19
Herramientas comunes
include 'clases/MiClase.php';
$miObjeto = new MiClase();
20
Herramientas comunes
21
Instalar Symfony
Instalar Symfony
Symfony es un framework creado con PHP 5 por
lo que es necesario disponer de esta versin.
Formas de instalar Symfony:
Sandbox
PEAR
SVN
23
Instalar Symfony
El paquete PEAR de Symfony incluye las libreras
propias de Symfony y todas sus dependencias.
Adems, tambin contiene un script que permite
extender la lnea de comandos del sistema para
que funcione el comando symfony.
Para instalar Symfony de esta manera, en primer
lugar se debe aadir el canal Symfony a PEAR
mediante este comando:
24
Instalar Symfony
25
Instalar Symfony
Crear el proyecto:
> mkdir ~/miproyecto
> cd ~/miproyecto
> symfony generate:project miproyecto
26
Instalar Symfony
Crear la aplicacin:
> php symfony generate:app miaplicacion
27
Instalar Symfony
28
Instalar Symfony
Ejemplo en apache/conf/httpd.conf
<VirtualHost *>
ServerName miaplicacion.ejemplo.com
DocumentRoot "/home/jordi/miproyecto/web"
DirectoryIndex index.php
Alias /sf /$sf_symfony_data_dir/web/sf
<Directory "/$sf_symfony_data_dir/web/sf">
AllowOverride All
Allow from All
</Directory>
<Directory "/home/jordi/miproyecto/web">
AllowOverride All
Allow from All
</Directory>
</VirtualHost>
Instalar Symfony
127.0.0.1
miaplicacion.ejemplo.com
30
Instalar Symfony
http://miaplicacion.ejemplo.com/miaplicacion_dev.php/
31
Instalar Symfony
Symfony utiliza la reescritura de URL para mostrar "URL
limpias" en la aplicacin, es decir, URL con mucho sentido,
optimizadas para buscadores y que ocultan a los usuarios
los detalles tcnicos internos de la aplicacin.
Para que funcione correctamente la reescritura de URL, es
necesario que Apache est compilado con el mdulo
mod_rewrite o al menos que est instalado el mdulo
mod_rewrite como mdulo DSO. En este ltimo caso, la
configuracin de Apache debe contener las siguientes lneas
en el archivo httpd.conf:
AddModule mod_rewrite.c
LoadModule rewrite_module
modules/mod_rewrite.so
32
34
> cd ~/miproyecto
> symfony generate:module miaplicacion mimodulo
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
dir+
dir+
file+
dir+
dir+
dir+
file+
dir+
file+
tokens
tokens
tokens
~/miproyecto/apps/miaplicacion/modules/mimodulo
~/miproyecto/apps/miaplicacion/modules/mimodulo/actions
~/miproyecto/apps/miaplicacion/modules/mimodulo/actions/actions.class.php
~/miproyecto/apps/miaplicacion/modules/mimodulo/config
~/miproyecto/apps/miaplicacion/modules/mimodulo/lib
~/miproyecto/apps/miaplicacion/modules/mimodulo/templates
~/miproyecto/apps/miaplicacion/modules/mimodulo/templates/indexSuccess.php
~/miproyecto/apps/miaplicacion/modules/mimodulo/validate
~/miproyecto/test/functional/miaplicacion/mimoduloActionsTest.php
~/miproyecto/test/functional/miaplicacion/mimoduloActionsTest.php
~/miproyecto/apps/miaplicacion/modules/mimodulo/actions/actions.class.php
~/miproyecto/apps/miaplicacion/modules/mimodulo/templates/indexSuccess.php
35
<?php
class mimoduloActions extends sfActions
{
public function executeIndex()
{
$this->forward('default', 'module');
}
}
http://miaplicacion.ejemplo.com/miaplicacion_dev.php/mimodulo/index
36
<?php
class mimoduloActions extends sfActions
{
public function executeMiAccion()
{
}
}
37
http://miaplicacion.ejemplo.com/miaplicacion_dev.php/mimodulo/miAccion
38
<p>Hola, mundo!</p>
39
40
Accin:
<?php
Plantilla:
<p>Hola, Mundo!</p>
<?php if ($hora >= 18): ?>
<p>Quizs debera decir buenas tardes. Ya son las <?
php echo $hora ?>.</p>
<?php endif; ?>
41
Formularios:
42
<p>Hola, Mundo!</p>
<?php if ($hora >= 18): ?>
<p>Quizs debera decir buenas tardes. Ya son las <?php echo $hora ?>.</p>
<?php endif; ?>
<?php echo form_tag('mimodulo/otraAccion') ?>
<?php echo label_for('nombre', 'Cmo te llamas?') ?>
<?php echo input_tag('nombre') ?>
<?php echo submit_tag('Ok') ?>
</form>
43
<?php
class mimoduloActions extends sfActions
{
...
public function executeOtraAccion()
{
$this->nombre = $this->getRequestParameter('nombre');
}
}
44
45
MVC
MVC
La capa de la Vista
Vista
Plantilla
Layout
47
MVC
En total son siete scripts. Afortunadamente,
Symfony simplifica este proceso.
En primer lugar, el controlador frontal y el layout
son comunes para todas las acciones de la
aplicacin. Se pueden tener varios controladores
y varios layouts, pero solamente es obligatorio
tener uno de cada.
El controlador frontal es un componente que slo
tiene cdigo relativo al MVC, por lo que no es
necesario crear uno, ya que Symfony lo genera
de forma automtica.
48
MVC
49
MVC
50
MVC: Controlador
MVC: Controlador
La capa del controlador contiene el cdigo que
liga la lgica de negocio con la presentacin.
Est dividida en varios componentes que se
utilizan para diversos propsitos:
Controlador frontal
Acciones
52
MVC: Controlador
Filtros
53
MVC: Controlador
El Controlador Frontal:
http://miaplicacion.ejemplo.com/index.php/mimodulo/miAccion
54
MVC: Controlador
Acciones:
55
MVC: Controlador
Acciones:
56
MVC: Controlador
Acciones:
MVC: Controlador
Acciones:
return sfView::SUCCESS;
58
MVC: Controlador
Acciones:
Success
return sfView::SUCCESS;
Error
return sfView::ERROR;
Personalizada
return 'MiResultado';
MVC: Controlador
Acciones:
$this->forward('otroModulo', 'index');
60
MVC: Controlador
Accediendo a la Peticin:
Nombre
Funcin
getMethod()
Mtodo de la peticin
getMethodName()
POST
getHttpHeader('Server')
getCookie('foo')
valor
isXmlHttpRequest() (1)
true
isSecure()
true
hasParameter('parametro')
Existe el parmetro en la
peticin?
true
getParameter('parametro')
valor
getParameterHolder()->getAll()
Parmetros de la peticin
61
MVC: Controlador
Accediendo a la Peticin:
Nombre
Funcin
http://localhost/miaplicacion_dev.php/mimodulo/mi
getUri()
URI completa
getPathInfo()
Informacin de la ruta
/mimodulo/miaccion
getReferer() (2)
http://localhost/miaplicacion_dev.php/
getHost()
localhost
getScriptName()
miaplicacion_dev.php
getCharsets()
getAcceptableContentType()
(1) Funciona slo con prototype (2) A veces es bloqueado por los proxy
62
MVC: Controlador
Sesiones de Usuario:
MVC: Controlador
Sesiones de Usuario:
64
MVC: Vista
MVC: Vista
Se encarga de producir las pginas que se
muestran como resultado de las acciones.
La vista en Symfony est compuesta por diversas
partes, estando cada una de ellas especialmente
preparada para que pueda ser fcilmente
modificable por la persona que normalmente
trabaja con cada aspecto del diseo de las
aplicaciones.
66
MVC: Vista
Plantillas:
<h1>Bienvenido</h1>
<p>Hola de nuevo, <?php echo $nombre ?>!</p>
<ul>Qu es lo que quieres hacer?
<li><?php echo link_to('Leer los ltimos artculos', 'articulo/leer') ?></li>
<li><?php echo link_to('Escribir un nuevo artculo', 'articulo/escribir') ?></li>
</ul>
67
MVC: Vista
Helpers:
Helpers de Symfony:
68
MVC: Vista
Helpers:
Helpers de Symfony:
69
MVC: Vista
70
MVC: Vista
71
MVC: Vista
Fragmentos de cdigo:
Componentes (component):
-
Slot:
-
72
MVC: Vista
Partial:
73
MVC: Vista
Partial:
74
MVC: Vista
Partial:
<p>Hola Mundo!</p>
<?php include_partial('miparcial', array('mitotal' => $total)) ?>
75
MVC: Vista
Componentes:
MVC: Vista
Componentes:
<?php
class newsComponents extends sfComponents
{
public function executeHeadlines()
{
$c = new Criteria();
$c->addDescendingOrderByColumn(NewsPeer::PUBLISHED_AT);
$c->setLimit(5);
$this->news = NewsPeer::doSelect($c);
}
}
El elemento parcial, en
modules/news/templates/_headlines.php
<div>
<h1>ltimas noticias</h1>
<ul>
<?php foreach($news as $headline): ?>
<li>
<?php echo $headline->getPublishedAt() ?>
<?php echo link_to($headline->getTitle(),'news/show?id='.$headline>getId()) ?>
</li>
<?php endforeach ?>
</ul>
</div>
77
MVC: Vista
Componentes:
78
MVC: Vista
Slots:
79
MVC: Vista
Slots:
80
MVC: Vista
Slots:
81
MVC: Vista
Slots:
<div id="lateral">
<?php if (has_slot('lateral')): ?>
<?php include_slot('lateral') ?>
<?php else: ?>
<!-- cdigo del lateral por defecto -->
<h1>Zona cuyo contenido depende del contexto</h1>
<p>Esta zona contiene enlaces e informacin sobre
el contenido principal de la pgina.</p>
<?php endif; ?>
</div>
82
MVC: Vista
Configuracin de la vista:
83
MVC: Vista
El archivo view.yml:
editSuccess:
metas:
title: Edita tu perfil
editError:
metas:
title: Error en la edicin del perfil
all:
stylesheets: [mi_estilo]
metas:
title: Mi sitio web
84
MVC: Vista
El archivo view.yml:
default:
http_metas:
content-type: text/html
metas:
title:
robots:
description:
keywords:
language:
symfony project
index, follow
symfony project
symfony, project
en
stylesheets:
[main]
javascripts:
[ ]
has_layout:
layout:
on
layout
85
MVC: Vista
86
MVC: Modelo
MVC: Modelo
El componente que gestiona el modelo es una
capa de tipo ORM (object/relational mapping)
realizada mediante el proyecto Propel
(http://propel.phpdb.org/).
El acceso y la modificacin de los datos
almacenados en la base de datos se realiza
mediante objetos.
Este comportamiento permite un alto nivel de
abstraccin y permite una fcil portabilidad.
88
MVC: Modelo
MVC: Modelo
Ejemplo de esquema:
Ejemplo de schema.yml
propel:
blog_article:
_attributes:
id:
title:
content:
created_at:
blog_comment:
_attributes:
id:
article_id:
author:
content:
created_at:
{ phpName: Article }
varchar(255)
longvarchar
{ phpName: Comment }
varchar(255)
longvarchar
90
MVC: Modelo
91
MVC: Modelo
-
92
MVC: Modelo
93
MVC: Modelo
94
MVC: Modelo
95
MVC: Modelo
MVC: Modelo
97
MVC: Modelo
98
MVC: Modelo
Orientado a objetos
Tabla
Clase
Fila, registro
Objeto
Campo, columna
Propiedad
99
MVC: Modelo
100
MVC: Modelo
101
MVC: Modelo
// Sintaxis alternativa
// Solo es correcta cuando el objeto artculo ya
// ha sido guardado anteriormente en la base de datos
$comentario->setArticleId($articulo->getId());
102
MVC: Modelo
Guardar datos:
$articulo->save();
MVC: Modelo
Borrar datos:
104
MVC: Modelo
105
MVC: Modelo
106
MVC: Modelo
SQL
Criteria
->add(columna, valor);
Criteria::GREATER_THAN, Criteria::LESS_THAN
>=, <=
Criteria::GREATER_EQUAL,
Criteria::LESS_EQUAL
Criteria::ISNULL, Criteria::ISNOTNULL
LIKE, ILIKE
Criteria::LIKE, Criteria::ILIKE
IN, NOT IN
Criteria::IN, Criteria::NOT_IN
->addAscendingOrderByColumn(columna);
->addDescendingOrderByColumn(columna);
LIMIT limite
->setLimit(limite)
OFFSET desplazamiento
->setOffset(desplazamiento)
->addJoin(col1, col2)
107
MVC: Modelo
$conexion = Propel::getConnection();
$consulta = 'SELECT MAX(%s) AS max FROM %s';
$consulta = sprintf($consulta, ArticlePeer::CREATED_AT, ArticlePeer::TABLE_NAME);
$sentencia = $conexion->prepareStatement($consulta);
$resultset = $sentencia->executeQuery();
$resultset->next();
$max = $resultset->getInt('max');
108
MVC: Modelo
prod:
propel:
param:
hostspec:
username:
password:
all:
propel:
class:
param:
phptype:
hostspec:
database:
username:
password:
port:
encoding:
persistent:
miservidordatos
minombreusuario
xxxxxxxxxx
sfPropelDatabase
mysql
# fabricante de la base de datos
localhost
blog
login
passwd
80
utf8
# Codificacin utilizada para crear la tabla
true
# Utilizar conexiones persistentes
109
MVC: Modelo
Extender el modelo
110
Enlaces y sistema de
enrutamiento
112
113
Generadores
Generadores
Muchas aplicaciones web se reducen a una mera
interfaz de acceso a la informacin almacenada
en una base de datos.
Symfony automatiza la tarea repetitiva de crear
mdulos para manipular datos mediante el uso de
objetos Propel. Si el modelo de objetos est bien
definido, es posible incluso generar de forma
automtica la parte de administracin completa de
un sitio web.
En esta seccin se explican los 2 tipos de
generadores automticos incluidos en Symfony:
Scaffolding
Generador de la parte de administracin.
115
Generadores
Scaffolding:
Generadores
Administracin:
Generadores
Scaffolding
Generando el scaffolding:
La vista list, que es la vista por defecto, muestra las filas de datos de
la tabla blog_article cuando se accede a la aplicacin mediante
http://localhost/miaplicacion_dev.php/article:
118
Generadores
La edicin, edit:
119
Generadores
// En actions/actions.class.php
index
// Redirige a la accin "list"
list
// Muestra un listado de todas las filas de la tabla
show
// Muestra todas las columnas de una fila
edit
// Muestra un formulario para modificar la columnas de una
fila
update
// Accin que se llama en el formulario de la accin "edit"
delete
// Borra una fila
create
// Crea una nueva fila
// En templates/
editSuccess.php // Formulario para modificar una fila (vista "edit")
listSuccess.php // Listado de todas las filas (vista "list")
showSuccess.php // Detalle de una fila (vista "show")
120
Generadores
Iniciando el Scaffolding:
121
Generadores
122
Generadores
http://miaplicacion.ejemplo.com/backend.php/article
123
Generadores
Los mdulos de una administracin solamente pueden ser
iniciados y nunca generados.
Cdigo generado:
// En actions/actions.class.php
create
// Redirige a "edit"
delete
// Borra una fila
edit
// Muestra un formulario para modificar la columnas de una fila
// y procesa el envo del formulario
index
// Redirige a "list"
list
// Muestra un listado de todas las filas de la tabla
save
// Redirige a "edit"
// En templates/
_edit_actions.php
_edit_footer.php
_edit_form.php
_edit_header.php
_edit_messages.php
_filters.php
_list.php
_list_actions.php
_list_footer.php
_list_header.php
_list_messages.php
_list_td_actions.php
_list_td_stacked.php
_list_td_tabular.php
_list_th_stacked.php
_list_th_tabular.php
editSuccess.php
listSuccess.php
124
Generadores
sfPropelAdminGenerator
Article
default
125
Generadores
generator:
class:
param:
model_class:
theme:
fields:
author_id:
sfPropelAdminGenerator
Article
default
{ name: Article author }
list:
title:
List of all articles
display:
[title, author_id, category_id]
fields:
published_on: { params: date_format='dd/MM/yy' }
layout:
stacked
params:
|
%%is_published%%<strong>%%=title%%</strong><br /><em>by %%author%%
in %%category%% (%%published_on%%)</em><p>%%content_summary%%</p>
filters:
[title, category_id, author_id, is_published]
max_per_page:
2
edit:
title:
display:
"Post":
"Workflow":
fields:
category_id:
is_published:
created_on:
author_id:
published_on:
content:
params: disabled=true }
type: plain}
type: plain, params: date_format='dd/MM/yy' }
params: size=5 include_custom=>> Choose an author << }
credentials: }
params: rich=true tinymce_options=height:150 }
126
Bibliografia y referencias
Bibliografia y referencias
Symfony
http://www.symfony-project.org/tutorial/1_1/my-first-projec
Symfony wiki
http://www.symfony-project.org/book/1_1/
http://www.symfony-project.org
http://trac.symfony-project.com/wiki
Cheat Sheets
http://trac.symfony-project.com/wiki/CheatSheets
128