Cake PHP
Cake PHP
Cake PHP
Publicacin 2.x
14 de November de 2014
ndice general
1. Primeros Pasos
2. Parte 1: Tutorial para desarrollar el Blog
Descargar CakePHP . . . . . . . . . . . . .
Creando la base de datos para nuestro blog .
Configurando la Base de Datos . . . . . . .
Configuracin Opcional . . . . . . . . . . .
Sobre mod_rewrite . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
3
3
4
5
5
6
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
9
9
9
10
13
14
16
17
18
19
19
20
4. Instalacin
Descargar CakePHP . . . . . . . . . . . . . .
Permisos . . . . . . . . . . . . . . . . . . . .
Configuracin . . . . . . . . . . . . . . . . .
Desarrollo . . . . . . . . . . . . . . . . . . .
Produccin . . . . . . . . . . . . . . . . . .
Instalacin avanzada y configuracin flexible
A por todas ! . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
29
29
30
30
30
31
32
38
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
5. Introduccin a CakePHP
41
Qu es CakePHP? y Por qu usarlo? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
Entendiendo el Modelo - Vista - Controlador . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
Dnde encontrar ayuda . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
6. ES - Deployment
47
7. Tutoriales y Ejemplos
49
Parte 1: Tutorial para desarrollar el Blog . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
Parte 2: Tutorial para desarrollar el Blog . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
8. Indices and tables
II
65
CAPTULO 1
Primeros Pasos
CakePHP te proporciona una base robusta para construir tus aplicaciones. Se encarga de todo, desde la peticin inicial del usuario hasta la construccin del cdigo HTML final. Como CakePHP sigue los fundamentos
del patrn MVC, te permite personalizar y extender fcilmente cada una de sus partes.
Este framework tambin proporciona una estructura organizacional: desde los nombres de ficheros hasta
los nombres de las tablas en la base de datos. Esto mantiene tu aplicacin consistente y ordenada. Siendo un concepto sencillo, seguir las convenciones definidas te facilitar encontrar rpidamente cada cosa y
aprenders en menos tiempo los fundamentos del framework.
La mejor manera de empezar es ponerte manos a la obra y desarrollar algo. Para empezar construiremos un
Blog sencillo.
CAPTULO 2
Bienvenido a CakePHP. Probablemente ests consultando este tutorial porque quieres aprender cmo funciona CakePHP. Nuestro objetivo es potenciar tu productividad y hacer ms divertido el desarrollo de aplicaciones. Esperamos que puedas comprobarlo a medida que vas profundizando en el cdigo.
En este tutorial vamos a crear un blog sencillo desde cero. Empezaremos descargando e instalando CakePHP,
luego crearemos una base de datos y el cdigo necesario para listar, aadir, editar o borrar artculos del blog.
Esto es lo que necesitas:
1. Servidor web funcionando. Asumiremos que ests usando Apache, aunque las instrucciones para otros
servidores son similares. Igual tendremos que ajustar un poco la configuracin inicial, pero todos los
pasos son sencillos. La mayor parte de nosotros podr tener CakePHP funcionando sin tocar nada en
su configuracin.
2. Base de datos funcionando. Usaremos MySQL en este tutorial. Necesitars saber cmo crear una base
de datos nueva. CakePHP se encargar del resto.
3. Nivel bsico de PHP. Si ests familiarizado con la programacin orientada a objetos, mucho mejor.
An as puedes seguir desarrollando con tu estilo procedimental si lo prefieres.
4. Conocimiento sobre patrn MVC. Puedes encontrar una definicin rpida aqu: Entendiendo el Modelo - Vista - Controlador. No tengas miedo, slo es media pgina.
Vamos all !
Descargar CakePHP
Vamos a descargar la ltima versin de CakePHP.
Para ello, visita la web del proyecto en github: https://github.com/cakephp/cakephp/tags y descargar / descomprimir la ltima versin de la rama 2.0
Tambin
1
puedes
clonar
el
repositorio
usando
git1 .
git clone
http://git-scm.com/
git://github.com/cakephp/cakephp.git
Usa el mtodo que prefieras y coloca la carpeta que has descargado bajo la ruta de tu servidor web (dentro
de tu DocumentRoot). Una vez terminado, tu directorio debera tener esta estructura:
/path_to_document_root
/app
/lib
/plugins
/vendors
.htaccess
index.php
README
Es buen momento para aprender algo sobre cmo funciona esta estructura de directorios: echa un vistazo a
Directorios en CakePHP, Seccin: Estructura de directorios de CakePHP.
La eleccin de los nombres para el nombre de la tabla y de algunas columnas no se ha hecho al azar. Si
sigues las convenciones para nombres en la Base de Datos, y las dems convenciones en tus clases (ver ms
sobre convenciones aqu: Convenciones en CakePHP), aprovechars la potencia del framework y ahorrars
mucho trabajo de configuracin.
CakePHP es flexible, si no quieres usar las convenciones puedes configurar luego cada elemento para que
funcione con tu Base de Datos legada. Te recomendamos que utilices estas convenciones ya que te ahorrarn
tiempo.
Al llamar posts a nuestra tabla de artculos, estamos diciendo a CakePHP que vincule esta tabla por defecto al Modelo Post, e incluir los campos modified y created con ese nombre, sern automticamente
4
por
Edita ahora este fichero y vers un array definido en la variable $default que contiene varios campos.
Modifica esos campos para que se correspondan con tu configuracin actual de acceso a la Base de Datos.
Debera quedarte algo similar a esto:
public $default = array(
datasource => Database/Mysql,
persistent => false,
host => localhost,
port => ,
login => cakeBlog,
password => c4k3-rUl3Z,
database => cake_blog_tutorial,
schema => ,
prefix => ,
encoding =>
);
Ten en cuenta que los campos login, password, database tendrs que cambiarlos por tu usuario de
MySQL, tu contrasea de MySQL y el nombre que le diste a la Base de Datos.
Guarda este fichero.
Ahora ya podrs acceder a la pgina inicial de bienvenida de CakePHP en tu mquina. Esta pgina podrs
accederla normalmente en http://localhost/cakeblog si has llamado a la carpeta raz del proyecto cakeblog.
Vers una pgina de bienvenida que muestra varias informaciones de configuracin y te indica si tienes
correctamente instalado CakePHP.
Configuracin Opcional
Hay otras tres cosas que puedes querer configurar, aunque no son requeridas para este tutorial no est mal
echarles un vistazo. Para ello abre el fichero /app/Config/core.php que contiene todos estos parmetros.
1. Configurar un string de seguridad salt para usarlo al realizar los hash.
2. Configurar un nmero semilla para el encriptado seed.
3. Definir permisos de escritura en la carpeta Tmp. El servidor web (normalmente apache) debe poder
escribir dentro de esta carpeta y subcarpetas.
El string de seguridad se utiliza en la generacin de hashes. Cambia el valor inicial y escribe cualquier cosa
diferente. Cualquier cosa vale. Para cambiarlo vete a la lnea 203 del fichero /app/Config/core.php
y vers algo as:
/**
* A random string used in security hashing methods.
*/
Configure::write(Security.salt, pl345e-P45s_7h3*S@l7!);
El nmero semilla se utiliza para encriptar y desencriptar cadenas. Cambia el valor por defecto en el ficharo
/app/Config/core.php lnea 208. No importa qu numero pongas, que sea difcil de adivinar.
/**
* A random numeric string (digits only) used to encrypt/decrypt strings.
*/
Configure::write(Security.cipherSeed, 7485712659625147843639846751);
Para dar permisos al directorio app/Tmp, la mejor forma es ver qu usuario est ejecutando el servidor web
(<?php echo whoami; ?>) y cambiar el directorio para que el nuevo propietario sea el usuario que
ejecuta el servidor web.
En un sistema *nix esto se hace as:
$ chown -R www-data app/tmp
Suponiendo que www-data sea el usuario que ejecuta tu servidor web (en otras versiones de *unix como
fedora, el usuario suele llamarse apache).
Si CakePHP no puede escribir en este directorio, te informar de ello en la pgina de bienvenida, siempre
que tengas activado el modo depuracin, por defecto est activo.
Sobre mod_rewrite
Si eres nuevo usuario de apache, puedes encontrar alguna dificultad con mod_rewrite, as que lo trataremos
aqu.
Si al cargar la pgina de bienvenida de CakePHP ves cosas raras (no se cargan las imgenes ni los estilos y
se ve todo en blanco y negro), esto significa que probablemente la configuracin necesita ser revisada en el
servidor apache. Prueba lo siguiente:
1. Asegrate de que existe la configuracin para procesar los ficheros .htaccess. En el fichero de configuracin de apache: httpd.conf debera existir una seccin para cada Directory de tu servidor.
Asegrate de que AllowOverride est fijado a All para el directorio que contiene tu aplicacin
web. Para tu seguridad, es mejor que no asignes All a tu directorio raz <Directory /> sino que
busques el bloque <Directory> que se refiera al directorio en el que tienes instalada tu aplicacin
web.
2. Asegrate que ests editando el fichero httpd.conf correcto, ya que en algunos sistemas hay ficheros
de este tipo por usuario o por aplicacin web. Consulta la documentacin de apache para tu sistema.
6
3. Comprueba que existen los ficheros .htaccess en el directorio en el que est instalada tu aplicacin
web. A veces al descomprimir el archivo o al copiarlo desde otra ubicacin, estos ficheros no se copian
correctamente. Si no estn ah, obtn otra copia de CakePHP desde el servidor oficial de descargas.
4. Asegrate de tener activado el mdulo mod_rewrite en la configuracin de apache. Deberas tener
algo as:
LoadModule rewrite_module
libexec/httpd/mod_rewrite.so
mod_rewrite.c
en tu fichero httpd.conf
Si no puedes (o no quieres) configurar mod_rewrite o algn otro mdulo compatible, necesitars activar las
url amigables en CakePHP. En el fichero /app/Config/core.php, quita el comentario a la lnea:
Configure::write(App.baseUrl, env(SCRIPT_NAME));
Sobre mod_rewrite
CAPTULO 3
Los convenios usados para los nombres son importantes. Cuando llamamos a nuestro modelo Post, CakePHP
deducir automticamente que este modelo se utilizar en el controlador PostsController, y que se vincular
a una tabla en nuestra base de datos llamada posts.
Nota: CakePHP crear dinmicamente un objeto para el modelo si no encuentra el fichero correspondiente
en /app/Model. Esto significa que si te equivocas al nombrar el fichero (por ejemplo lo llamas post.php con
la primera p minscula o posts.php en plural) CakePHP no va a reconocer la configuracin que escribas en
ese fichero y utilizar valores por defecto.
Para ms informacin sobre modelos, como prefijos para las tablas, validacin, etc. puedes visitar /models
en el Manual.
Y vamos a aadir una accin a nuestro nuevo controlador. Las acciones representan una funcin concreta o interfaz en nuestra aplicacin. Por ejemplo, cuando los usuarios recuperan la url www.example.com/posts/index (que CakePHP tambin asigna por defecto a la ruta
www.example.com/posts/ ya que la accin por defecto de cada controlador es index por convencin) esperan ver un listado de posts. El cdigo para tal accin sera este:
class PostsController extends AppController {
public $helpers = array (Html,Form);
function index() {
$this->set(posts, $this->Post->find(all));
}
}
Si examinamos el contenido de la funcin index() en detalle, podemos ver que ahora los usuarios podrn
acceder a la ruta www.example.com/posts/index. Adems si creramos otra funcin llamada foobar(),
los usuarios podran acceder a ella en la url www.example.com/posts/foobar.
Advertencia: Puede que tengas la tentacin de llamar tus controladores y acciones de forma determinada
para que esto afecte a la ruta final, y as puedas predeterminar estas rutas. No te preocupes por esto
ya que CakePHP incorpora un potente sistema de configuracin de rutas. Al escribir los ficheros, te
recomendamos seguir las convenciones de nombres y ser claro. Luego podrs generar las rutas que te
convengan utilizando el componente de rutas (Route).
La funcin index tiene slo una instruccin set() que sirve para pasar informacin desde el controlador a la vista (view) asociada. Luego crearemos esta vista. Esta funcin set() asigna una nueva variab
le posts igual al valor retornado por la funcin find(all) del modelo Post. Nuestro modelo Post
est disponible automticamente en el controlador y no hay que importarlo ya que hemos usado las convenciones de nombres de CakePHP.
Para aprender ms sobre los controladores, puedes visitar el captulo /controllers
10
Recuerdas que el controlador envi a la vista una variable posts que contiene todos los posts mediante
el mtodo set() ? Esto nos generar una variable en la vista con esta pinta:
// print_r($posts) output:
Array
(
[0] => Array
(
[Post] => Array
(
[id] => 1
[title] => The title
[body] => This is the post body.
[created] => 2008-02-13 18:34:55
[modified] =>
)
)
[1] => Array
(
[Post] => Array
(
[id] => 2
[title] => A title once again
[body] => And the post body follows.
[created] => 2008-02-13 18:34:56
[modified] =>
)
)
[2] => Array
(
[Post] => Array
(
[id] => 3
[title] => Title strikes back
[body] => This is really exciting! Not.
[created] => 2008-02-13 18:34:57
[modified] =>
)
)
)
Las vistas en CakePHP se almacenan en la ruta /app/View y en un directorio con el mismo nombre que
el controlador al que pertenecen, en nuestro caso Posts, as que para mostrar estos elementos formateados
mediante una tabla tendremos algo como esto:
<!-- File: /app/View/Posts/index.ctp -->
<h1>Blog posts</h1>
<table>
<tr>
<th>Id</th>
<th>Title</th>
<th>Created</th>
11
</tr>
<!-- Here is where we loop through our $posts array, printing out post info -->
<?php foreach ($posts as $post): ?>
<tr>
<td><?php echo $post[Post][id]; ?></td>
<td>
<?php echo $this->Html->link($post[Post][title],
array(controller => posts, action => view, $post[Post][id])); ?>
</td>
<td><?php echo $post[Post][created]; ?></td>
</tr>
<?php endforeach; ?>
</table>
12
Si observas la funcin view(), ahora el mtodo set() debera serte familiar. Vers que estamos usando
read() en vez de find(all) ya que slo queremos un post concreto.
Vers que nuestra funcin view toma un parmetro ($id), que es el ID del artculo que queremos ver. Este
parmetro se gestiona automticamente al llamar a la URL /posts/view/3, el valor 3 se pasa a la funcin
view como primer parmetro $id.
Vamos a definir la vista para esta nueva funcin, como hicimos antes para index() salvo que el nombre ahora
ser /app/View/Posts/view.ctp.
<!-- File: /app/View/Posts/view.ctp -->
<h1><?php echo $post[Post][title]?></h1>
<p><small>Created: <?php echo $post[Post][created]?></small></p>
<p><?php echo $post[Post][body]?></p>
Verifica que ahora funciona el enlace que antes daba un error desde /posts/index o puedes ir manualmente si escribes /posts/view/1.
13
}
}
14
Hemos usado FormHelper para generar la etiqueta form. Esta llamada al FormHelper :
$this->Form->create() generara el siguiente cdigo
<form id="PostAddForm" method="post" action="/posts/add">
Si create() no tiene parmetros al ser llamado, asume que ests creando un formulario que realiza el
submit al mtodo del controlador add() o al mtodo edit() si hay un id en los datos del formulario.
Por defecto el formulario se enviar por POST.
Las llamadas $this->Form->input() se usan para crear los elementos del formulario con el nombre
que se pasa por parmetro. El primer parmetro indica precisamente el nombre del campo del modelo para
el que se quiere crear el elemento de entrada. El segundo parmetro te permite definir muchas otras variables
sobre la forma en la que se generar este input field. Por ejemplo, al enviar array(rows => 3)
estamos indicando el nmero de filas para el campo textarea que vamos a generar. El mtodo input() est
dotado de introspeccin y un poco de magia, ya que tiene en cuenta el tipo de datos del modelo al generar
cada campo.
Una vez creados los campos de entrada para nuestro modelo, la llamada $this->Form->end() genera un botn de submit en el formulario y cierra el tag <form>. Puedes ver todos los detalles aqu
/views/helpers.
Volvamos atrs un minuto para aadir un enlace en /app/View/Post/index.ctp que nos permita
agregar nuevos artculos. Justo antes del tag <table> aade la siguiente lnea:
echo $this->Html->link(Add Post, array(controller => posts, action => add));
Te estars preguntando: Cmo le digo a CakePHP la forma en la que debe validar estos datos ? Muy
sencillo, las reglas de validacin se escriben en el modelo. Abre el modelo Post y vamos a escribir all
algunas reglas sencillas
class Post extends AppModel {
public $name = Post;
public $validate = array(
title => array(
rule => notEmpty
),
body => array(
rule => notEmpty
)
);
}
El array $validate contiene las reglas definidas para validar cada campo, cada vez que se llama al mtodo
save(). En este caso vemos que la regla para ambos campos es que no pueden ser vacos notEmpty. El
conjunto de reglas de validacin de CakePHP es muy potente y variado. Podrs validar direcciones de email,
codificacin de tarjetas de crdito, incluso aadir tus propias reglas de validacin personalizadas. Para ms
informacin sobre esto /models/data-validation.
Ahora que ya tienes las reglas de validacin definidas, usa tu aplicacin para crear un nuevo artculo con
un ttulo vaco y vers cmo funcionan. Como hemos usado el mtodo FormHelper::input(), los
mensajes de error se construyen automticamente en la vista sin cdigo adicional.
15
Editando Posts
Seguro que ya le vas cogiendo el truco a esto. El mtodo es siempre el mismo: primero la accin en el
controlador, luego la vista. Aqu est el mtodo edit():
public function edit($id = null) {
if (!$id) {
throw new NotFoundException(__(Invalid post));
}
$post = $this->Post->findById($id);
if (!$post) {
throw new NotFoundException(__(Invalid post));
}
if ($this->request->is(array(post, put))) {
$this->Post->id = $id;
if ($this->Post->save($this->request->data)) {
$this->Session->setFlash(__(Your post has been updated.));
return $this->redirect(array(action => index));
}
$this->Session->setFlash(__(Unable to update your post.));
}
if (!$this->request->data) {
$this->request->data = $post;
}
}
Esta accin primero comprueba que se trata de un GET request. Si lo es, buscamos un Post con el id
proporcionado como parmetro y lo ponemos a disposicin para usarlo en la vista. Si la llamada no es GET,
usaremos los datos que se enven por POST para intentar actualizar nuestro artculo. Si encontramos algn
error en estos datos, lo enviaremos a la vista sin guardar nada para que el usuario pueda corregirlos.
La vista quedar as:
<!-- File: /app/View/Posts/edit.ctp -->
<h1>Edit
<?php
echo
echo
echo
echo
echo
Post</h1>
$this->Form->create(Post, array(action => edit));
$this->Form->input(title);
$this->Form->input(body, array(rows => 3));
$this->Form->input(id, array(type => hidden));
$this->Form->end(Save Post);
Mostramos el formulario de edicin (con los valores actuales de ese artculo), junto a los errores de validacin que hubiese.
Una cosa importante, CakePHP asume que ests editando un modelo si su id est presente en su array
de datos. Si no hay un id presente, CakePHP asumir que es un nuevo elemento al llamar a la funcin
save(). Puedes actualizar un poco tu vista index para aadir los enlaces de edicin de un artculo especfico:
16
<h1>Blog posts</h1>
<p><?php echo $this->Html->link("Add Post", array(action => add)); ?></p>
<table>
<tr>
<th>Id</th>
<th>Title</th>
<th>Action</th>
<th>Created</th>
</tr>
<!-- Heres where we loop through our $posts array, printing out post info -->
Borrando Artculos
Vamos a permitir a los usuarios que borren artculos. Primero, el mtodo en nuestro controlador:
function delete($id) {
if (!$this->request->is(post)) {
throw new MethodNotAllowedException();
}
if ($this->Post->delete($id)) {
$this->Session->setFlash(The post with id: . $id . has been deleted.);
$this->redirect(array(action => index));
}
}
Este
mtodo
borra
un
artculo
cuyo
id
enviamos
como
parmetro
y
usa
$this->Session->setFlash() para mostrar un mensaje si ha sido borrado. Luego redirige a
/posts/index. Si el usuario intenta borrar un artculo mediante una llamada GET, generaremos una
Borrando Artculos
17
excepcin. Las excepcines que no se traten, sern procesadas por CakePHP de forma genrica, mostrando
una bonita pgina de error. Hay muchas excepciones a tu disposicin /development/exceptions
que puedes usar para informar de diversos problemas tpicos.
Como estamos ejecutando algunos mtodos y luego redirigiendo a otra accin de nuestro controlador, no es
necesaria ninguna vista (nunca se usa). Lo que si querrs es actualizar la vista index.ctp para inclur el ya
habitual enlace:
<!-- File: /app/View/Posts/index.ctp -->
<h1>Blog posts</h1>
<p><?php echo $this->Html->link(Add Post, array(action => add)); ?></p>
<table>
<tr>
<th>Id</th>
<th>Title</th>
<th>Actions</th>
<th>Created</th>
</tr>
<!-- Heres where we loop through our $posts array, printing out post info -->
Nota: Esta vista utiliza el FormHelper para pedir confirmacin al usuario antes de borrar un artculo.
Adems el enlace para borrar el artculo se construye con Javascript para que se realice una llamada POST.
Rutas (Routes)
En muchas ocasiones, las rutas por defecto de CakePHP funcionan bien tal y como estn. Los desarroladores
que quieren rutas diferentes para mejorar la usabilidad apreciarn la forma en la que CakePHP relaciona las
URLs con las acciones de los controladores. Vamos a hacer cambios ligeros para este tutorial.
Para ms informacin sobre las rutas, visita esta referencia routes-configuration.
18
Por defecto CakePHP responde a las llamadas a la raz de tu sitio (por ejemplo www.example.com/) usando
el controlador PagesController, y la accin display/home. Esto muestra la pgina de bienvenida con
informacin de CakePHP que ya has visto. Vamos a cambiar esto mediante una nueva regla.
Las reglas de enrutamiento estn en /app/Config/routes.php. Comentaremos primero la regla de la
que hemos hablado:
Router::connect(/, array(controller => pages, action => display, home));
Como habamos dicho, esta regla conecta la URL / con el controlador pages la accin display y le pasa
como parmetro home, as que reemplazaremos esta regla por esta otra:
Router::connect(/, array(controller => posts, action => index));
Conclusin
Creando aplicaciones de este modo te traer paz, amor, dinero a carretas e incluso te conseguir lo dems
que puedas querer. As de simple.
Ten en cuenta que este tutorial es muy bsico, CakePHP tiene muchas otras cosas que harn tu vida ms
fcil, y es flexible aunque no hemos cubierto aqu estos puntos para que te sea ms simple al principio. Usa
el resto de este manual como una gua para construir mejores aplicaciones (recuerda todo los los beneficios
que hemos mencionado un poco ms arriba)
Ahora ya ests preparado para la accin. Empieza tu propio proyecto, lee el resto del manual y el API
Manual API1 .
http://api20.cakephp.org
Conclusin
19
Lectura Adicional
Diseccionando un Request tpico en CakePHP
Ya hemos cubierto los ingredientes bsicos de CakePHP, as que ahora vamos a ver cmo interactan sus
componentes para completar una peticin de usuario o Request. Continuando con nuestro ejemplo anterior,
imaginemos que nuestro amigo Ricardo acaba de pinchar en el link Compra un Pastel Personalizado en
una aplicacin CakePHP.
4. El controlador puede utilizar uno o varios modelos para acceder a los datos. En este ejemplo, el controlador utiliza un modelo para recuperar las ltimas compras que ha hecho Ricardo de la Base de Datos.
Cualquier callback del modelo, comportamiento (behavior), o DataSource que sea aplicable puede ser
ejecutado en este momento. Aunque utilizar un modelo no es obligatorio, todos los controladores de
CakePHP requieren inicialmente un modelo.
5. Una vez el modelo ha recuperado los datos, es devuelto al controlador. Se aplican aqu los callbacks
del modelo.
6. El controlador puede utilizar componentes para refinar los datos o realizar otras operaciones (manipular la sesin, autenticacin o enviar emails, por ejemplo).
7. Una vez el controlador ha empleado los modelos y componentes para preparar los datos, se envan a
la vista utilizando el mtodo set(). Los callback del controlador pueden ser ejecutados antes de que
los datos sean enviados. La lgica de la vista se realiza en este punto. Esto puede inclur el uso de
elementos (elements) y/o helpers. Por defecto, las vistas son generadas dentro de una plantilla (layout).
8. Callback adicionales pueden ejecutarse ahora (como afterFilter) en el controlador. La vista, ya generada por completo, se enva al navegador de Ricardo, que puede realizar su crtica compra de Pastel
Personalizado.
Convenciones en CakePHP
(Nota del Traductor: Posiblemente la traduccin de conventions sea muy literal. Queremos expresar el uso
por defecto de determinados acuerdos que nos permiten establecer un marco comn de trabajo).
Preferimos el uso de convenciones sobre la configuracin. Aunque ocupars algo de tu tiempo aprendiendo
las convenciones usadas en CakePHP, ahorrars mucho ms en el camino. Cuando usas las convenciones,
aprovechas funcionalidad gratuita y te liberas de la pesadilla de mantener los ficheros de configuracin.
Trabajar con convenciones tambin estandariza el proceso de despliegue de tu aplicacin, permitiendo a
otros desarrolladores conocer tu estructura ms fcilmente.
Hemos empleado varios aos y toda nuestra experiencia y buenas prcticas en la creacin de estas convenciones. Ya sabes que, aunque te recomendamos que las sigas, puedes evitarlas con facilidad. Esto te resultar
especialmente til cuando trates con sistemas legados.
Convenciones en los Controladores
Nombre del Controlador en plural, CamelCased, y colocando Controller al final.
PeopleController y LatestArticlesController son ejemplos que siguen esta convencin.
El primer mtodo a escribir en el controlador es index(). Cuando una peticin vaya dirigida a
este controlador, pero no se especifique accin, CakePHP ejecutar por defecto el mtodo index().
Por ejemplo, la peticin http://example.com/apples/ ser dirigida al mtodo index() del controlador
ApplesController, as como la llamada a http://example.com/apples/view/ se mapear al mtodo
view() de este mismo controlador.
Puedes cambiar la visibilidad de los mtodos de CakePHP usando el carcter subrayado _ al principio
para ocultar su acceso directo desde la web, aunque ser accesible internamente. Por ejemplo:
Lectura Adicional
21
El acceso a la url http://example.com/news/latest podr realizarse con normalidad, mientras que al acceder a
la url http://example.com/news/_findNewArticles/ retornar un error, ya que este mtodo est precedido por
un _. Tambin puedes usar los modificadores de visibilidad de PHP (private, protected, public) para esto.
Los mtodos que no sean pblicos, no podrn ser accedidos.
Consideraciones para las URL de los controladores
Como acabas de ver, los controladores que tienen nombres de una sla palabra se asignan a una URL
en minscula. Por ejemplo ApplesController (que se definir en el fichero con nombre ApplesController.php) se acceder desde la URL http://example.com/apples.
Controladores cuyo nombre tiene varias palabras podran ser asignados de cualquiera de estas formas
/redApples
/RedApples
/Red_apples
/red_apples
todos ellos resolveran al mtodo index del controlador RedApples. De todos la convencin es que esa url
sea minscula y subrayada, de este modo
/red_apples/go_pick sera la url correcta para acceder a RedApplesController::go_pick
Para ms informacin sobre URLs y parmetros en CakePHP, consulta routes-configuration.
Convenciones sobre nombres de fichero y nombres de clases
Como regla general, los nombres de fichero y los nombres de clase sern iguales, en formato CamelCased.
Si tienes una clase MyNiftyClass, el fichero que la contiene se llamar MyNiftyClass.php. En el listado
siguiente se muestran algunos ejemplos:
El controlador con nombre KissesAndHugsController estar definido en el fichero KissesAndHugsController.php
El componente con nombre MyHandyComponent estar en el fichero MyHandyComponent.php
El modelo con nombre OptionValue estar en el fichero OptionValue.php
22
En vez de usar un campo numrico autoincremental como clave primaria, tambin puedes usar un char(36).
Si has definido as tu clave primaria, CakePHP gestionar esta clave aadiendo un UUID (String::uuid), que
es un cdigo nico que identificar a cada registro, cada vez que realices un Model::save en ese modelo.
Lectura Adicional
23
Convenciones en la vistas
Los nombres de las vistas son iguales a los del mtodo del controlador al que hacen referencia, en formato
subrayado. Por ejemplo el mtodo getReady() del controlador PeopleController buscar el fichero de vista
en la ruta /app/View/People/get_ready.ctp.
El patrn para nombrar las vistas es /app/View/Controller/underscored_function_name.ctp.
Si usas las convenciones de CakePHP para tu aplicacin, ganas inmediatamente funcionalidad gratis, que se
mantiene sola y no necesita tocar la configuracin. Sirva para ilustrar esto un ejemplo:
Tabla en la base de datos: people
Nombre de Modelo: Person (es el singular de people para CakePHP), en el fichero
/app/Model/Person.php
Nombre del Controlador: PeopleController, en el fichero /app/Controller/PeopleController.php
Plantilla para la vista en el fichero /app/View/People/index.ctp
Si usas estas convenciones, CakePHP sabr que una llamada a http://example.com/people/ se mapear a
una llamada al mtodo index() del controlador PeopleController, donde el modelo Person ser instanciado
automticamente para su uso (leer los datos de la tabla people en la base de datos). Ninguna de estas
relaciones necesita ser creada ni configurada s nombras de la forma correcta los los ficheros que de todos
modos tienes que crear para que tu aplicacin funcione.
Ahora conoces los fundamentos y convenciones que debes utilizar en CakePHP, te recomendamos que le
eches un vistazo al tutorial para hacer un blog para ver cmo encajan estas piezas en una aplicacin completa.
24
vendors que es donde puedes colocar los recursos externos que necesites para que tu aplicacin funcione.
El directorio APP
En este directorio es donde realizars la mayor parte del desarrollo de tu aplicacin. Veamos el contenido
de esta carpeta:
Config Aqu estn los (pocos) ficheros de configuracin que usa CakePHP, concretamente la conexin con
la base de datos, bootstrapping o el fichero de arranque, la configuracin del ncleo y otros ficheros
tambin de configuracin estarn aqu.
Controller Contiene los ficheros donde estn definidos los Controladores de tu aplicacin y los componentes.
Lib Contiene recursos que no son de terceros o externos a tu aplicacin. Esto te ayuda a separar tus libreras
internas de las externas que estarn en la carpeta vendors.
Locale Aqu estn los ficheros de traduccin para facilitar la internacionalizacin de tu proyecto.
Model Contiene los modelos de tu aplicacin, comportamientos (behaviors) y fuentes de datos (datasources).
Plugins Contiene los plugins, increble verdad ?
tmp Aqu guarda CakePHP los datos temporales que se generan en ejecucin. Los datos que se guardan
dependen de tu configuracin. Normalmente se almacenan las descripciones de los modelos, ficheros
de registro (logs) y ficheros que almacenan las sesiones activas.
Este directorio debe exisitr y el usuario que ejecuta el servidor web debe ser capaz de escribir en
esta ruta, de otro modo el rendimiento de tu aplicacin puede reducirse enormemente. Cuando el
parmetro debug est activo, CakePHP te advertir si no se puede escribir en este directorio.
Vendors Cualquier recurso de terceros o libreras PHP deben colocarse aqu. Si lo haces as, podrs importarlas luego cmodamente usando la funcin App::import(vendor, name). Si eres atento, te habrs
fijado en que hay dos carpetas Vendors, una aqu y otra en el directorio raz de esta estructura.
Entraremos en detalle sobre las diferencias cuando hablemos de configuraciones complejas de instalacin de CakePHP. Por ahora, ten en cuenta que no nos gusta repetirnos, cada carpeta tiene un
cometido distinto.
View Los ficheros de presentacin (vistas) se colocan aqu: elementos, pginas de error, helpers y plantillas
(templates).
webroot Este ser el directorio raz de tu aplicacin web. Aqu habr varias carpetas que te permitirn servir
ficheros CSS, imgenes y JavaScript.
Estructura de CakePHP
CakePHP implementa las clases para controladores, modelos y vistas, pero tambin incluye otras clases y
objetos que aceleran y facilitan el desarrollo en un framework MVC y lo hacen ms ameno. Componentes,
comportamientos y helpers, son clases que favorecen la extensibilidad y reutilizacin de tu cdigo entre
pryectos. Empezaremos con una visin de alto nivel y luego examinaremos los detalles de cada parte.
Lectura Adicional
25
iCal. Las fuentes de datos te permiten asociar registros de diferentes orgenes: en vez de estar limitado a
consultas SQL, las fuentes de datos te permitiran decirle a tu modelo LDAP que est asociado a mltiples
eventos iCal.
Igual que los controladores, los modelos poseen callbacks:
beforeFind()
afterFind()
beforeValidate()
beforeSave()
afterSave()
beforeDelete()
afterDelete()
Los nombres de estos mtodos deberan ser descriptivos por s mismos. Encontrars todos los detalles en el
captulo que habla sobre los modelos.
Extendiento las vistas (Helpers)
Un helper es una clase que sirve de apoyo a las vistas. De forma similar a los componentes y los controladores, los helpers permiten que la lgica que usas en las vistas se pueda acceder desde otras vistas o en
otras aplicaciones. Uno de los helpers que se distribuye con CakePHP es AjaxHelper, permite que se realicen
llamadas Ajax desde las vistas de forma mucho ms sencilla.
La mayora de aplicaciones tiene trozos de cdigo que se usan una y otra vez. CakePHP facilita la reutilizacin de cdigo con plantillas y elementos. Por defecto cada vista que se genera por un controlador se
incrusta dentro de una plantilla. Los elementos se usan como un modo sencillo de empaquetar cdigo para
poder ser usado en cualquier vista.
Lectura Adicional
27
28
CAPTULO 4
Instalacin
CakePHP se instala de forma fcil y rpidamente. Los requisitos mnimos son: un servidor web y una copia
de los archivos de CakePHP Eso es todo! Aunque este manual se centra en la configuracin de Apache,
ya que es el servidor web ms comn, se puede configurar CakePHP para que funcione en otros servidores
como LightHTTPD o Microsoft IIS.
Vamos a preparar el proceso de instalacin, que consta de los siguientes pasos:
Descargar copia de CakePHP
Configurar el servidor web para que use PHP
Comprobar que los permisos de ficheros y carpetas son correctos
Descargar CakePHP
Hay dos opciones: descargar un archivo comprimido con todo el cdigo (zip/tar.gz/tar.bz2) de la web oficial
o realizar un checkout del cdigo directamente desde el repositorio de git.
Para descargar la ltima versin estable, puedes vistar la pgina oficial http://cakephp.org y pichar en la
opcin Download Now.
Adems, todas las versiones de CakePHP estn hospedadas en Github1 . Github almacena tanto el cdigo de
CakePHP como muchos otros plugins para el sistema. Las versiones release de CakePHP estn disponibles
aqu Github tags2 .
Tambin se puede obtener la ltima versin, con las ltimas correcciones de errores y mejoras de ltima
hora (o al menos en ese da). Para ello puedes clonar el repositorio. Github3 .
1
https://github.com/cakephp/cakephp
https://github.com/cakephp/cakephp/tags
3
https://github.com/cakephp/cakephp
2
29
Permisos
CakePHP usa el directorio /app/tmp para varias cosas, como guardar las descripciones de los modelos, la
cache de las vistas y la informacin de sesin de los usuarios.
Por ello debes, asegrarte de que el directorio /app/tmp de tu instalacin de CakePHP puede ser escrito
por el usuario que ejecuta tu servidor web. Ten en cuenta que cuando tu servidor web se inicia, define
un usuario como propietario del servicio. Este usuario suele llamarse apache o www-data en algunas
versiones de sistemas *nix. Por lo tanto la carpeta /app/tmp debe tener permisos de escritura para que el
usuario propietario del servidor web pueda escribir dentro de ella.
Configuracin
Configurar CakePHP es tan sencillo como copiar la carpeta en la carpeta raz de tu servidor web (document
root) o tan complejo y flexible como quieras para que se adapte a tu sistema. En esta seccin cubriremos los
3 modos ms frecuentes: desarrollo, produccin, avanzado.
Desarrollo: fcil y rpido. Las URL de tu aplicacin incluyen la carpeta de instalacin de CakePHP.
Es menos seguro.
Produccin: Requiere poder cambiar el document root de su servidor web, proporciona URL amigables y es muy seguro.
Avanzado: Te permite colocar la carpeta de CakePHP en otras partes de tu sistema de archivos, posiblemente para compartir el ncleo con varias aplicaciones web basadas en CakePHP.
Desarrollo
Instalar CakePHP para desarrollo es el mtodo ms rpido de empezar. Este ejemplo te ayudar a instalar
una aplicacin CakePHP y configurarla para que se accesible desde http://www.example.com/cake_2_0/.
Asumiremos que tu document root (la carpeta raz de tu servidor web) es /var/www/html.
Descomprime los contenidos del archivo que contiene CakePHP en la carpeta /var/www/html. Ahora
tendrs un nuevo directorio con el nombre de la versin que te has descargado (por ejemplo cake_2.0.0).
Cambia el nombre de este directorio a algo ms sencillo, por ejemplo a cake20. La estructura de directorios
debera ser ahora similar a esta:
/var/www/html
/cake20
/app
/lib
/vendors
/plugins
/.htaccess
30
Captulo 4. Instalacin
/index.php
/README
Si la configuracin de tu servidor web es correcta, ahora podrs acceder a tu aplicacin accediendo a:
http://localhost/cake20 .
Este comando clonar CakePHP en tu directorio /home/mark/projects. Si no quieres usar git, puedes
descargar el archivo zip del repositorio, todos los dems pasos sern los mismos. Lo siguiente es modificar
el archivo de configuracin de PHP php.ini. En sistemas *nix, este archivo suele estar ubicado en la ruta
/etc/php.ini, pero puedes localizarlo fcilmente mediante el comando php -i, busca la ruta bajo el
epgrafe Loaded Configuration File. Cuando hayas localizado el fichero correcto, modifica el parmetro
include_path y aade el directorio /home/mark/projects/cakephp/lib. Ejemplo:
include_path = .:/home/mark/projects/cakephp/lib:/usr/local/php/lib/php
Reinicia el servidor web, deberas ver los cambios aplicados en la salida de phpinfo().
Nota: Si utilizas Windows, separa las rutas en el include path con ; en vez de :
Tras modificar este parmetro y reiniciar el servidor web, tus aplicaciones podrn utilizar CakePHP automticamente.
Produccin
Se llama entorno de Produccin porque es el lugar al que accedern los usuarios finales de la aplicacin
web. Una instalacin en Produccin es una forma ms flexible de configurar CakePHP. Usando este mtodo
permite que un dominio completo acte como una nica aplicacin CakePHP. El siguiente ejemplo permitir
ayudar a instalar CakePHP en cualquier parte del sistema de archivos y tener la aplicacin disponible en
http://www.example.com. Ten en cuenta que esta instalacin requiere que tengas permiso de escritura en el
directorio raz de tu servidor web document root.
Descomprime los contenidos del paquete que has descargado con la ltima versin de CakePHP en el directorio que prefieras. No es necesario que sea una carpeta de tu document root. Por ejemplo vamos a suponer
que quieres tener tus archivos de CakePHP en la ruta /cake_install. Tu sistema de archivos sera
entonces:
/cake_install/
/app
Produccin
31
Captulo 4. Instalacin
Veamos todo esto con un ejemplo. Imagina que quiero crear una estructura de directorios como sigue:
La instalacin de CakePHP la quiero en /usr/lib/cake.
Mi directorio raz webroot lo colocar en /var/www/mysite/.
Mi directorio app con el cdigo de mi aplicacin lo colocar en /home/me/myapp.
Para llevar esto a cabo, necesitar editar el fichero /var/www/mysite/index.php para que se parezca a este:
// /app/webroot/index.php (partial, comments removed)
if (!defined(ROOT)) {
define(ROOT, DS . home . DS . me);
}
if (!defined(APP_DIR)) {
define (APP_DIR, myapp);
}
if (!defined(CAKE_CORE_INCLUDE_PATH)) {
define(CAKE_CORE_INCLUDE_PATH, DS . usr . DS . lib);
}
Recomendamos utilizar la constante DS en vez del caracter / para delimitar las rutas de directorios. Esto
permite que tu cdigo sea ms portable ya que este caracter cambia en algunos sistemas operativos. Usa DS.
Apache, mod_rewrite y .htaccess
CakePHP est escrito para funcionar con mod_rewrite sin tener que realizar ningn cambio. Normalmente
ni te dars cuenta de que ya est funcionando, aunque hemos visto que para algunas personas es un poco
ms complicado configurarlo para que funcione bien en su sistema.
Te proponemos algunas cosas que te pueden ayudar a que quede bien configurado.
Lo primero: echa un vistazo a tu fichero de configuracin de Apache httpd.conf (asegrate de estar editando
el fichero correcto, ya que puede haber ficheros de este tipo por usuario o por sitio web. Edita el fichero de
configuracin principal).
1. Debe estar permitido la reescritura de ficheros .htaccess (override), y el parmetro AllowOverride
debe estar fijado a All para el DocumentRoot en el que reside tu aplicacin web. Deberas ver algo
similar a esto:
# Cada directorio al que tiene acceso Apache debe ser configurado
# para indicar qu funciones estn habilitadas y deshabilitadas
#
# Primero se configura un directorio por defecto restringido por seguridad
#
<Directory />
Options FollowSymLinks
AllowOverride All
#
Order deny,allow
#
Deny from all
</Directory>
33
1. Comprueba que efectivamente se est cargando mod_rewrite ya que en algunos sistemas viene desactivado por defecto en Apache. Para ello deberas ver la siguiente lnea sin comentario (#) al
principio:
LoadModule rewrite_module libexec/apache2/mod_rewrite.so
Si ves que tiene un comentario al principio de la lnea, qutalo. Si has tenido que hacer algn cambio a este
fichero, necesitars reiniciar el servicio Apache.
Verifica que los ficheros .htaccess estn ah.
A veces, al copiar archivos de un lugar a otro los ficheros con un nombre que empieza por . se consideran
ocultos y no se copian. Hay que forzar la copia de estos ficheros.
1. Asegrate de que tu copia de CakePHP es de nuestro sitio oficial o del repositorio oficial de GIT, y
que la has descomprimido correctamente.
En el directorio raz de CakePHP (necesita ser copiado a tu carpeta, esto redirige todo a tu aplicacin
CakePHP):
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule
^ $ app/webroot/
RewriteRule
</IfModule>
[L]
webroot/
(.*) webroot/ $ 1
[L]
[L]
Muchos de las empresas de hosting (GoDaddy, 1and1) ya tienen mod_rewrite activo y su servidor web
ya utiliza un directorio de usuario para servir el contenido. Si ests instalando CakePHP en un directorio de usuario, por ejemplo (http://example.com/~username/cakephp/) o cualquier otra ruta que ya utilice
mod_rewrite necesitars aadir una directiva RewriteBase al los ficheros .htaccess que se utilizan (todos).
Nota: Si al cargar la pgina de bienvenida de CakePHP ves que no se aplican bien los estilos, puede que
necesites esta directiva RewriteBase en tus ficheros .htaccess.
34
Captulo 4. Instalacin
Para aadir la directiva, abre los 3 ficheros .htaccess y escribe la nueva directiva bajo la lnea RewriteEngine
(dentro del IfModule para que tu fichero de configuracin slo se aplique si mod_rewrite est cargado):
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /path/to/cake/app
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*) $ index.php [QSA,L]
</IfModule>
Este cambio depender de tu configuracin. Puede que debas realizar otros cambios en funcin de tu servidor. Para aclarar dudas, consulta la documentacin de Apache.
URLs amigables y Lighttpd
Aunque Lighttpd incluye un mdulo de redireccin, no es igual que mod_rewrite de Apache. Para que
funcionen las URLs del mismo modo, tienes dos opciones:
Usar mod_rewrite
Usar un script LUA y mod_magnet
Usando mod_rewrite La manera ms sencilla es aadir este script a la configuracin de lighty. Slo edita la URL y todo debera ir bien. Ten en cuenta que esto no funciona si CakePHP ha sido instalado en
subdirectorios.
$HTTP["host"] =~ "^(www\.)?example.com$" {
url.rewrite-once = (
# if the request is for css|files etc, do not pass on to Cake
"^/(css|files|img|js)/(.*)" => "/$1/$2",
"^([^\?]*)(\?(.+))?$" => "/index.php/$1&$3",
)
evhost.path-pattern = "/home/%2-%1/www/www/%4/app/webroot/"
}
35
-- the magic ;)
if (not file_exists(lighty.env["physical.path"])) then
-- file still missing. pass it to the fastcgi backend
request_uri = removePrefix(lighty.env["uri.path"], prefix)
if request_uri then
lighty.env["uri.path"]
= prefix .. "/index.php"
local uriquery = lighty.env["uri.query"] or ""
lighty.env["uri.query"] = uriquery .. (uriquery ~= "" and "&" or "") .. "url=" .. req
lighty.env["physical.rel-path"] = lighty.env["uri.path"]
lighty.env["request.orig-uri"] = lighty.env["request.uri"]
lighty.env["physical.path"]
= lighty.env["physical.doc-root"] .. lighty.env["phys
end
end
-- fallthrough will put it back into the lighty request loop
-- that means we get the 304 handling for free. ;)
y escribe la nueva directiva bajo la lnea RewriteEngine (dentro del IfModule para que tu fichero de configuracin slo se aplique si mod_rewrite est cargado):
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /path/to/cake/app
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*) $ index.php/ $ 1 [QSA,L]
</IfModule>
Este cambio depender de tu configuracin. Puede que debas realizar otros cambios en funcin de tu servidor. Para aclarar dudas, consulta la documentacin de Apache.
Nota: Si has instalado CakePHP en un subdirectorio, debes colocar set prefix = nombre-del-subdirectorio
el el script anterior.
Luego Lighttpd para tu host virtual:
$HTTP["host"] =~ "example.com" {
server.error-handler-404
= "/index.php"
magnet.attract-physical-path-to = ( "/etc/lighttpd/cake.lua" )
server.document-root = "/var/www/cake-1.2/app/webroot/"
# Think about getting vim tmp files out of the way too
url.access-deny = (
"~", ".inc", ".sh", "sql", ".sql", ".tpl.php",
".xtmpl", "Entries", "Repository", "Root",
".ctp", "empty"
)
}
y listo !
36
Captulo 4. Instalacin
37
Tambin puedes usar la funcionalidad Importar en el mdulo de reescritura de IIS, para importar directamente las reglas de todos los ficheros .htaccess de CakePHP. Si importas las reglas de este modo, IIS crear
el fichero web.config. Es posible que neceites retocar un poco esta configuracin hasta que funcione.
Una vez creado el archivo web.config con la configuracin correcta de reglas de reescritura para IIS, los
links, css, js y enrutado de CakePHP deberan funcionar correctamente.
A por todas !
Vamos a ver de qu es capaz tu recientemente instalado CakePHP. Dependiendo de qu opcin
de configuracin hayas elegido, podrs acceder a tu aplicacin mediante http://www.example.com/ o
http://example.com/cake_install/. Vers una pgina de bienvenida por defecto, que mostrar un mensaje
que te dice el estado actual de conexin a la Base de Datos.
38
Captulo 4. Instalacin
A por todas !
39
40
Captulo 4. Instalacin
CAPTULO 5
Introduccin a CakePHP
Bienvenido al Cookbook, el manual web del framework CakePHP hace que el desarrollo de aplicaciones
sea pan comido.
Este manual asume que tienes una comprensin general de PHP y un conocimiento bsico de programacin
orientada a objetos (POO). Las diferentes funcionalidades que este framework posee hace uso de teconolgas
como SQL, JavaScript y XML y este manual no trata de explicarlas, sino slo la forma en que se utilizados
en su contexto.
http://www.cakephp.org/
http://en.wikipedia.org/wiki/Application_framework
3
http://en.wikipedia.org/wiki/MIT_License
4
http://en.wikipedia.org/wiki/Open_source
5
http://en.wikipedia.org/wiki/Rapid_application_development
6
http://www.php.net/
7
http://github.com/cakephp/cakephp/contributors
2
41
Comunidad amigable8
Licencia flexible9
Compatible con las versiones de PHP 5.2.6 y superiores.
Contiene CRUD10 para la interaccin de la base de datos.
Andamiaje de cdigo11 .
Generacin automtica de cdigo.
Arquitectura MVC12
URLs personalizadas
Funcin de Validacin13 .
Plantillas rpidas y flexibles14 (La sintaxis de PHP, con ayudantes).
Ayudantes para AJAX, JavaScript, formularios HTML y ms.
Componentes de Email, Cookie, Seguridad, Sesin y otros.
ACL15 flexible.
Sanitizacin de Datos.
Poderoso Cach16 .
Localizacin e Internacionalizacin.
Funciona desde cualquier directorio de sitios web, con poca o ninguna configuracin adicional.
http://cakephp.org/feeds
http://en.wikipedia.org/wiki/MIT_License
10
http://en.wikipedia.org/wiki/Create,_read,_update_and_delete
11
http://en.wikipedia.org/wiki/Scaffold_(programming)
12
http://en.wikipedia.org/wiki/Model-view-controller
13
http://en.wikipedia.org/wiki/Data_validation
14
http://en.wikipedia.org/wiki/Web_template_system
15
http://en.wikipedia.org/wiki/Access_control_list
16
http://en.wikipedia.org/wiki/Web_cache
17
http://en.wikipedia.org/wiki/Model-view-controller
9
42
como su procesamiento, validacin, asociacin y cualquier otra tarea relativa a la manipulacin de dichos
datos.
A primera vista los objetos del modelo puede ser considerados como la primera capa de la interaccin con
cualquier base de datos que podra estar utilizando tu aplicacin. Pero en general representan los principales
conceptos en torno a los cuales se desea implementar un programa.
En el caso de una red social, la capa de modelo se hara cargo de tareas tales como guardar datos del usuario,
el amacenamiento de asociaciones con amigos, el almacenamiento y la recuperacin de fotos de los usuarios,
encontrar sugerencias de nuevos amigos, etc. Mientras que los objetos del modelo pueden ser considerados
como Amigo, Usuario, Comentario y Foto.
La capa de la Vista
La vista hace una presentacin de los datos del modelo estando separada de los objetos del modelo. Es
responsable del uso de la informacin de la cual dispone para producir cualquier interfaz de presentacin de
cualquier peticin que se presente.
Por ejemplo, como la capa de modelo devuelve un conjunto de datos, la vista los usara para hacer una pgina
HTML que los contenga. O un resultado con formato XML para que otras aplicaciones puedan consumir.
La capa de la Vista no se limita nicamente a HTML o texto que represente los datos, sino que puede ser
utilizada para ofrecer una amplia variedad de formatos en funcin de sus necesidades tales como videos,
msica, documentos y cualquier otro formato que puedas imaginar.
43
Beneficios
Por qu utilizar MVC? Debido a que es un patrn de diseo de software verdaderamente probado que
convierte una aplicacin en un paquete modular fcil de mantener y mejora la rapidez del desarrollo. La
separacin de las tareas de tu aplicacin en modelos, vistas y controladores hace que su aplicacin sea
adems muy ligeras de entender. Las nuevas caractersticas se aaden fcilmente y agregar cosas nuevas a
cdigo viejo se hace muy sencillo. El diseo modular tambin permite a los desarrolladores y los diseadores
trabajar simultneamente, incluyendo la capacidad de hacer prototipos rpidos18 .
La separacin tambin permite a los desarrolladores hacer cambios en una parte del la aplicacin sin afectar
a los dems.
18
44
http://en.wikipedia.org/wiki/Software_prototyping
Si nunca has creado una aplicacin de esta forma se necesita algn tiempo para acostumbrarse, pero estamos
seguros que una vez que hayas terminado tu primera aplicacin con CakePHP no vas a querer hacerlo de
cualquier otra manera.
Para iniciarte con tu primera aplicacin en CakePHP haz este tutorial ahora
El manual
http://book.cakephp.org
Este manual debe ser probablemente el primer lugar al que acudir para obtener respuestas. Al igual que con
muchos otros proyectos de cdigo abierto, tenemos gente nueva con regularidad. Haz tu mejor esfuerzo para
responder tus propias preguntas por cuenta propia en primer lugar, esto te ayudar a entender los conceptos
ms rpidamente y a nosotros a mejorar la documentacin.
The Bakery
http://bakery.cakephp.org
The Bakery Es el sitio oficial para publicar todo lo relacionado a CakePHP, desde tutoriales, nuevos plugins,
actualizaciones a CakePHP hasta casos de estudio de usuarios del framework.
El API
http://api20.cakephp.org/
Directo al grano y directamente de los desarrolladores principales, el API (Application Programming Interface) de CakePHP es el ms una amplia documentacin en torno a todos los detalles del funcionamiento
interno del framework. Si quieres los detalles de cada funcin, los parmetros, y ver cmo las clases se
complementan entre s, este es el lugar para buscar.
45
lib/Cake/Test/Case
El canal IRC
Canales IRC oficiales en irc.freenode.net:
#cakephp Discusin general en Ingls
#cakephp-es Discusin general en Espaol
Si no tienes ni idea, nos peagas un grito en el canal de IRC de CakePHP. Alguien del equipo de desarrollo
est alli generalmente, sobre todo durante las horas del da de los usuarios del norte y Amrica del Sur. Nos
encantara saber de ti, si necesitas ayuda, quieres encontrar los usuarios en tu rea, o si deseas donarnos un
nuevo coche.
El grupo de Google
En Espaol: http://groups.google.com/group/cakephp-esp
En Ingls: http://groups.google.com/group/cake-php
CakePHP tiene tambin un Grupo de Google muy activo. Puede ser un gran recurso para encontrar las
respuestas archivadas, preguntas frecuentes, y obtener respuestas a los problemas inmediatos.
19
46
http://cakephp-fr.org
CAPTULO 6
ES - Deployment
47
48
Captulo 6. ES - Deployment
CAPTULO 7
Tutoriales y Ejemplos
En esta seccin puedes encontrar varias aplicaciones completas construidas en CakePHP que te ayudarn a
comprender el framework y ver cmo se relacionan todas las piezas.
Tambin puedes ver otros ejemplos en: CakeForge1 y en Bakery2 encontrars tambin componentes listos
para usar. No olvides que puedes ver el cdigo fuente del manual de CakePHP3 .
http://plugins.cakephp.org/
http://bakery.cakephp.org/
3
http://thechaw.com/cakebook/
2
49
Vamos all !
Descargar CakePHP
Vamos a descargar la ltima versin de CakePHP.
Para ello, visita la web del proyecto en github: https://github.com/cakephp/cakephp/tags y descargar / descomprimir la ltima versin de la rama 2.0
Tambin
puedes
clonar
el
repositorio
git://github.com/cakephp/cakephp.git
usando
git4 .
git clone
Usa el mtodo que prefieras y coloca la carpeta que has descargado bajo la ruta de tu servidor web (dentro
de tu DocumentRoot). Una vez terminado, tu directorio debera tener esta estructura:
/path_to_document_root
/app
/lib
/plugins
/vendors
.htaccess
index.php
README
Es buen momento para aprender algo sobre cmo funciona esta estructura de directorios: echa un vistazo a
Directorios en CakePHP, Seccin: Estructura de directorios de CakePHP.
50
http://git-scm.com/
La eleccin de los nombres para el nombre de la tabla y de algunas columnas no se ha hecho al azar. Si
sigues las convenciones para nombres en la Base de Datos, y las dems convenciones en tus clases (ver ms
sobre convenciones aqu: Convenciones en CakePHP), aprovechars la potencia del framework y ahorrars
mucho trabajo de configuracin.
CakePHP es flexible, si no quieres usar las convenciones puedes configurar luego cada elemento para que
funcione con tu Base de Datos legada. Te recomendamos que utilices estas convenciones ya que te ahorrarn
tiempo.
Al llamar posts a nuestra tabla de artculos, estamos diciendo a CakePHP que vincule esta tabla por defecto al Modelo Post, e incluir los campos modified y created con ese nombre, sern automticamente
administrados por CakePHP.
por
Edita ahora este fichero y vers un array definido en la variable $default que contiene varios campos.
Modifica esos campos para que se correspondan con tu configuracin actual de acceso a la Base de Datos.
Debera quedarte algo similar a esto:
public $default = array(
datasource => Database/Mysql,
persistent => false,
host => localhost,
port => ,
login => cakeBlog,
password => c4k3-rUl3Z,
database => cake_blog_tutorial,
schema => ,
prefix => ,
encoding =>
);
Ten en cuenta que los campos login, password, database tendrs que cambiarlos por tu usuario de
MySQL, tu contrasea de MySQL y el nombre que le diste a la Base de Datos.
Guarda este fichero.
Ahora ya podrs acceder a la pgina inicial de bienvenida de CakePHP en tu mquina. Esta pgina podrs
accederla normalmente en http://localhost/cakeblog si has llamado a la carpeta raz del proyecto cakeblog.
Vers una pgina de bienvenida que muestra varias informaciones de configuracin y te indica si tienes
correctamente instalado CakePHP.
51
Configuracin Opcional
Hay otras tres cosas que puedes querer configurar, aunque no son requeridas para este tutorial no est mal
echarles un vistazo. Para ello abre el fichero /app/Config/core.php que contiene todos estos parmetros.
1. Configurar un string de seguridad salt para usarlo al realizar los hash.
2. Configurar un nmero semilla para el encriptado seed.
3. Definir permisos de escritura en la carpeta Tmp. El servidor web (normalmente apache) debe poder
escribir dentro de esta carpeta y subcarpetas.
El string de seguridad se utiliza en la generacin de hashes. Cambia el valor inicial y escribe cualquier cosa
diferente. Cualquier cosa vale. Para cambiarlo vete a la lnea 203 del fichero /app/Config/core.php
y vers algo as:
/**
* A random string used in security hashing methods.
*/
Configure::write(Security.salt, pl345e-P45s_7h3*S@l7!);
El nmero semilla se utiliza para encriptar y desencriptar cadenas. Cambia el valor por defecto en el ficharo
/app/Config/core.php lnea 208. No importa qu numero pongas, que sea difcil de adivinar.
/**
* A random numeric string (digits only) used to encrypt/decrypt strings.
*/
Configure::write(Security.cipherSeed, 7485712659625147843639846751);
Para dar permisos al directorio app/Tmp, la mejor forma es ver qu usuario est ejecutando el servidor web
(<?php echo whoami; ?>) y cambiar el directorio para que el nuevo propietario sea el usuario que
ejecuta el servidor web.
En un sistema *nix esto se hace as:
$ chown -R www-data app/tmp
Suponiendo que www-data sea el usuario que ejecuta tu servidor web (en otras versiones de *unix como
fedora, el usuario suele llamarse apache).
Si CakePHP no puede escribir en este directorio, te informar de ello en la pgina de bienvenida, siempre
que tengas activado el modo depuracin, por defecto est activo.
Sobre mod_rewrite
Si eres nuevo usuario de apache, puedes encontrar alguna dificultad con mod_rewrite, as que lo trataremos
aqu.
Si al cargar la pgina de bienvenida de CakePHP ves cosas raras (no se cargan las imgenes ni los estilos y
se ve todo en blanco y negro), esto significa que probablemente la configuracin necesita ser revisada en el
servidor apache. Prueba lo siguiente:
52
1. Asegrate de que existe la configuracin para procesar los ficheros .htaccess. En el fichero de configuracin de apache: httpd.conf debera existir una seccin para cada Directory de tu servidor.
Asegrate de que AllowOverride est fijado a All para el directorio que contiene tu aplicacin
web. Para tu seguridad, es mejor que no asignes All a tu directorio raz <Directory /> sino que
busques el bloque <Directory> que se refiera al directorio en el que tienes instalada tu aplicacin
web.
2. Asegrate que ests editando el fichero httpd.conf correcto, ya que en algunos sistemas hay ficheros
de este tipo por usuario o por aplicacin web. Consulta la documentacin de apache para tu sistema.
3. Comprueba que existen los ficheros .htaccess en el directorio en el que est instalada tu aplicacin
web. A veces al descomprimir el archivo o al copiarlo desde otra ubicacin, estos ficheros no se copian
correctamente. Si no estn ah, obtn otra copia de CakePHP desde el servidor oficial de descargas.
4. Asegrate de tener activado el mdulo mod_rewrite en la configuracin de apache. Deberas tener
algo as:
LoadModule rewrite_module
libexec/httpd/mod_rewrite.so
mod_rewrite.c
en tu fichero httpd.conf
Si no puedes (o no quieres) configurar mod_rewrite o algn otro mdulo compatible, necesitars activar las
url amigables en CakePHP. En el fichero /app/Config/core.php, quita el comentario a la lnea:
Configure::write(App.baseUrl, env(SCRIPT_NAME));
53
Los convenios usados para los nombres son importantes. Cuando llamamos a nuestro modelo Post, CakePHP
deducir automticamente que este modelo se utilizar en el controlador PostsController, y que se vincular
a una tabla en nuestra base de datos llamada posts.
Nota: CakePHP crear dinmicamente un objeto para el modelo si no encuentra el fichero correspondiente
en /app/Model. Esto significa que si te equivocas al nombrar el fichero (por ejemplo lo llamas post.php con
la primera p minscula o posts.php en plural) CakePHP no va a reconocer la configuracin que escribas en
ese fichero y utilizar valores por defecto.
Para ms informacin sobre modelos, como prefijos para las tablas, validacin, etc. puedes visitar /models
en el Manual.
Y vamos a aadir una accin a nuestro nuevo controlador. Las acciones representan una funcin concreta o interfaz en nuestra aplicacin. Por ejemplo, cuando los usuarios recuperan la url www.example.com/posts/index (que CakePHP tambin asigna por defecto a la ruta
www.example.com/posts/ ya que la accin por defecto de cada controlador es index por convencin) esperan ver un listado de posts. El cdigo para tal accin sera este:
class PostsController extends AppController {
public $helpers = array (Html,Form);
function index() {
$this->set(posts, $this->Post->find(all));
}
}
Si examinamos el contenido de la funcin index() en detalle, podemos ver que ahora los usuarios podrn
acceder a la ruta www.example.com/posts/index. Adems si creramos otra funcin llamada foobar(),
los usuarios podran acceder a ella en la url www.example.com/posts/foobar.
54
Advertencia: Puede que tengas la tentacin de llamar tus controladores y acciones de forma determinada
para que esto afecte a la ruta final, y as puedas predeterminar estas rutas. No te preocupes por esto
ya que CakePHP incorpora un potente sistema de configuracin de rutas. Al escribir los ficheros, te
recomendamos seguir las convenciones de nombres y ser claro. Luego podrs generar las rutas que te
convengan utilizando el componente de rutas (Route).
La funcin index tiene slo una instruccin set() que sirve para pasar informacin desde el controlador a la vista (view) asociada. Luego crearemos esta vista. Esta funcin set() asigna una nueva variab
le posts igual al valor retornado por la funcin find(all) del modelo Post. Nuestro modelo Post
est disponible automticamente en el controlador y no hay que importarlo ya que hemos usado las convenciones de nombres de CakePHP.
Para aprender ms sobre los controladores, puedes visitar el captulo /controllers
55
Las vistas en CakePHP se almacenan en la ruta /app/View y en un directorio con el mismo nombre que
el controlador al que pertenecen, en nuestro caso Posts, as que para mostrar estos elementos formateados
mediante una tabla tendremos algo como esto:
<!-- File: /app/View/Posts/index.ctp -->
<h1>Blog posts</h1>
<table>
<tr>
<th>Id</th>
<th>Title</th>
<th>Created</th>
</tr>
<!-- Here is where we loop through our $posts array, printing out post info -->
<?php foreach ($posts as $post): ?>
<tr>
<td><?php echo $post[Post][id]; ?></td>
<td>
<?php echo $this->Html->link($post[Post][title],
array(controller => posts, action => view, $post[Post][id])); ?>
</td>
<td><?php echo $post[Post][created]; ?></td>
</tr>
<?php endforeach; ?>
</table>
56
la funcin link() generar un link HTML con el ttulo como primer parmetro y la URL como segundo
parmetro.
Cuando crees URLs en CakePHP te recomendamos emplear el formato de array. Se explica con detenimiento
en la seccin de Routes. Si utilizas estas rutas, podrs aprovecharte de las potentes funcionalidades de
generacin inversa de rutas de CakePHP en el futuro. Adems puedes especificar ritas relativas a la base de
tu aplicacin de la forma /controlador/accion/param1/param2.
Llegados a este punto, deberas poder ver esta pgina si escribes la ruta a tu aplicacin en el navegador, normalmente ser algo asi http://localhost/blog/posts/index. Deberas ver los posts correctamente formateados
en una tabla.
Vers que si pinchas sobre alguno de los enlaces que aparecen en esta pgina (que van a una URL
/posts/view/some_id, vers una pgina de error que te indica que la accin view() no ha sido definida todava, y que debes definirla en el fichero PostsController. Si no ves ese error, algo ha ido mal, ya que
esa accin no est definida y debera mostrar la pgina de error correspondiente. Cosa muy rara. Creemos
esta accin para evitar el error:
class PostsController extends AppController {
public $helpers = array(Html, Form);
public $name = Posts;
public function index() {
$this->set(posts, $this->Post->find(all));
}
public function view($id = null) {
$this->Post->id = $id;
$this->set(post, $this->Post->read());
}
}
Si observas la funcin view(), ahora el mtodo set() debera serte familiar. Vers que estamos usando
read() en vez de find(all) ya que slo queremos un post concreto.
Vers que nuestra funcin view toma un parmetro ($id), que es el ID del artculo que queremos ver. Este
parmetro se gestiona automticamente al llamar a la URL /posts/view/3, el valor 3 se pasa a la funcin
view como primer parmetro $id.
Vamos a definir la vista para esta nueva funcin, como hicimos antes para index() salvo que el nombre ahora
ser /app/View/Posts/view.ctp.
<!-- File: /app/View/Posts/view.ctp -->
<h1><?php echo $post[Post][title]?></h1>
<p><small>Created: <?php echo $post[Post][created]?></small></p>
<p><?php echo $post[Post][body]?></p>
Verifica que ahora funciona el enlace que antes daba un error desde /posts/index o puedes ir manualmente si escribes /posts/view/1.
57
58
Al llamar al mtodo save(), comprobar si hay errores de validacin primero y si encuentra alguno,
no continuar con el proceso de guardado. Veremos a continuacin cmo trabajar con estos errores de
validacin.
Hemos usado FormHelper para generar la etiqueta form. Esta llamada al FormHelper :
$this->Form->create() generara el siguiente cdigo
<form id="PostAddForm" method="post" action="/posts/add">
Si create() no tiene parmetros al ser llamado, asume que ests creando un formulario que realiza el
submit al mtodo del controlador add() o al mtodo edit() si hay un id en los datos del formulario.
Por defecto el formulario se enviar por POST.
Las llamadas $this->Form->input() se usan para crear los elementos del formulario con el nombre
que se pasa por parmetro. El primer parmetro indica precisamente el nombre del campo del modelo para
el que se quiere crear el elemento de entrada. El segundo parmetro te permite definir muchas otras variables
sobre la forma en la que se generar este input field. Por ejemplo, al enviar array(rows => 3)
estamos indicando el nmero de filas para el campo textarea que vamos a generar. El mtodo input() est
dotado de introspeccin y un poco de magia, ya que tiene en cuenta el tipo de datos del modelo al generar
cada campo.
Una vez creados los campos de entrada para nuestro modelo, la llamada $this->Form->end() genera un botn de submit en el formulario y cierra el tag <form>. Puedes ver todos los detalles aqu
/views/helpers.
Volvamos atrs un minuto para aadir un enlace en /app/View/Post/index.ctp que nos permita
agregar nuevos artculos. Justo antes del tag <table> aade la siguiente lnea:
echo $this->Html->link(Add Post, array(controller => posts, action => add));
59
Te estars preguntando: Cmo le digo a CakePHP la forma en la que debe validar estos datos ? Muy
sencillo, las reglas de validacin se escriben en el modelo. Abre el modelo Post y vamos a escribir all
algunas reglas sencillas
class Post extends AppModel {
public $name = Post;
public $validate = array(
title => array(
rule => notEmpty
),
body => array(
rule => notEmpty
)
);
}
El array $validate contiene las reglas definidas para validar cada campo, cada vez que se llama al mtodo
save(). En este caso vemos que la regla para ambos campos es que no pueden ser vacos notEmpty. El
conjunto de reglas de validacin de CakePHP es muy potente y variado. Podrs validar direcciones de email,
codificacin de tarjetas de crdito, incluso aadir tus propias reglas de validacin personalizadas. Para ms
informacin sobre esto /models/data-validation.
Ahora que ya tienes las reglas de validacin definidas, usa tu aplicacin para crear un nuevo artculo con
un ttulo vaco y vers cmo funcionan. Como hemos usado el mtodo FormHelper::input(), los
mensajes de error se construyen automticamente en la vista sin cdigo adicional.
Editando Posts
Seguro que ya le vas cogiendo el truco a esto. El mtodo es siempre el mismo: primero la accin en el
controlador, luego la vista. Aqu est el mtodo edit():
public function edit($id = null) {
if (!$id) {
throw new NotFoundException(__(Invalid post));
}
$post = $this->Post->findById($id);
if (!$post) {
throw new NotFoundException(__(Invalid post));
}
if ($this->request->is(array(post, put))) {
$this->Post->id = $id;
if ($this->Post->save($this->request->data)) {
$this->Session->setFlash(__(Your post has been updated.));
return $this->redirect(array(action => index));
}
$this->Session->setFlash(__(Unable to update your post.));
}
if (!$this->request->data) {
60
$this->request->data = $post;
}
}
Esta accin primero comprueba que se trata de un GET request. Si lo es, buscamos un Post con el id
proporcionado como parmetro y lo ponemos a disposicin para usarlo en la vista. Si la llamada no es GET,
usaremos los datos que se enven por POST para intentar actualizar nuestro artculo. Si encontramos algn
error en estos datos, lo enviaremos a la vista sin guardar nada para que el usuario pueda corregirlos.
La vista quedar as:
<!-- File: /app/View/Posts/edit.ctp -->
<h1>Edit
<?php
echo
echo
echo
echo
echo
Post</h1>
$this->Form->create(Post, array(action => edit));
$this->Form->input(title);
$this->Form->input(body, array(rows => 3));
$this->Form->input(id, array(type => hidden));
$this->Form->end(Save Post);
Mostramos el formulario de edicin (con los valores actuales de ese artculo), junto a los errores de validacin que hubiese.
Una cosa importante, CakePHP asume que ests editando un modelo si su id est presente en su array
de datos. Si no hay un id presente, CakePHP asumir que es un nuevo elemento al llamar a la funcin
save(). Puedes actualizar un poco tu vista index para aadir los enlaces de edicin de un artculo especfico:
<!-- File: /app/View/Posts/index.ctp
<h1>Blog posts</h1>
<p><?php echo $this->Html->link("Add Post", array(action => add)); ?></p>
<table>
<tr>
<th>Id</th>
<th>Title</th>
<th>Action</th>
<th>Created</th>
</tr>
<!-- Heres where we loop through our $posts array, printing out post info -->
<?php foreach ($posts as $post): ?>
<tr>
<td><?php echo $post[Post][id]; ?></td>
<td>
<?php echo $this->Html->link($post[Post][title], array(action => view,
</td>
<td>
<?php echo $this->Form->postLink(
Delete,
array(action => delete, $post[Post][id]),
61
Borrando Artculos
Vamos a permitir a los usuarios que borren artculos. Primero, el mtodo en nuestro controlador:
function delete($id) {
if (!$this->request->is(post)) {
throw new MethodNotAllowedException();
}
if ($this->Post->delete($id)) {
$this->Session->setFlash(The post with id: . $id . has been deleted.);
$this->redirect(array(action => index));
}
}
Este
mtodo
borra
un
artculo
cuyo
id
enviamos
como
parmetro
y
usa
$this->Session->setFlash() para mostrar un mensaje si ha sido borrado. Luego redirige a
/posts/index. Si el usuario intenta borrar un artculo mediante una llamada GET, generaremos una
excepcin. Las excepcines que no se traten, sern procesadas por CakePHP de forma genrica, mostrando
una bonita pgina de error. Hay muchas excepciones a tu disposicin /development/exceptions
que puedes usar para informar de diversos problemas tpicos.
Como estamos ejecutando algunos mtodos y luego redirigiendo a otra accin de nuestro controlador, no es
necesaria ninguna vista (nunca se usa). Lo que si querrs es actualizar la vista index.ctp para inclur el ya
habitual enlace:
<!-- File: /app/View/Posts/index.ctp -->
<h1>Blog posts</h1>
<p><?php echo $this->Html->link(Add Post, array(action => add)); ?></p>
<table>
<tr>
<th>Id</th>
<th>Title</th>
<th>Actions</th>
<th>Created</th>
</tr>
<!-- Heres where we loop through our $posts array, printing out post info -->
<?php foreach ($posts as $post): ?>
<tr>
<td><?php echo $post[Post][id]; ?></td>
62
<td>
<?php echo $this->Html->link($post[Post][title], array(action => view, $pos
</td>
<td>
<?php echo $this->Form->postLink(
Delete,
array(action => delete, $post[Post][id]),
array(confirm => Are you sure?));
?>
</td>
<td><?php echo $post[Post][created]; ?></td>
</tr>
<?php endforeach; ?>
</table>
Nota: Esta vista utiliza el FormHelper para pedir confirmacin al usuario antes de borrar un artculo.
Adems el enlace para borrar el artculo se construye con Javascript para que se realice una llamada POST.
Rutas (Routes)
En muchas ocasiones, las rutas por defecto de CakePHP funcionan bien tal y como estn. Los desarroladores
que quieren rutas diferentes para mejorar la usabilidad apreciarn la forma en la que CakePHP relaciona las
URLs con las acciones de los controladores. Vamos a hacer cambios ligeros para este tutorial.
Para ms informacin sobre las rutas, visita esta referencia routes-configuration.
Por defecto CakePHP responde a las llamadas a la raz de tu sitio (por ejemplo www.example.com/) usando
el controlador PagesController, y la accin display/home. Esto muestra la pgina de bienvenida con
informacin de CakePHP que ya has visto. Vamos a cambiar esto mediante una nueva regla.
Las reglas de enrutamiento estn en /app/Config/routes.php. Comentaremos primero la regla de la
que hemos hablado:
Router::connect(/, array(controller => pages, action => display, home));
Como habamos dicho, esta regla conecta la URL / con el controlador pages la accin display y le pasa
como parmetro home, as que reemplazaremos esta regla por esta otra:
Router::connect(/, array(controller => posts, action => index));
63
Conclusin
Creando aplicaciones de este modo te traer paz, amor, dinero a carretas e incluso te conseguir lo dems
que puedas querer. As de simple.
Ten en cuenta que este tutorial es muy bsico, CakePHP tiene muchas otras cosas que harn tu vida ms
fcil, y es flexible aunque no hemos cubierto aqu estos puntos para que te sea ms simple al principio. Usa
el resto de este manual como una gua para construir mejores aplicaciones (recuerda todo los los beneficios
que hemos mencionado un poco ms arriba)
Ahora ya ests preparado para la accin. Empieza tu propio proyecto, lee el resto del manual y el API
Manual API5 .
64
http://api20.cakephp.org
CAPTULO 8
genindex
modindex
65