Mi primera aplicación CakePHP (1)
1 Julio 2008
Tras hacer una presentación y ver su instalación, empezaremos a realizar una aplicación de ejemplo utilizando CakePHP. Me he decidido a empezar un gestor de enlaces al estilo de delicious o mister wong.
No voy a utilizar algunas utilidades de CakePHP como la herramienta de línea de comando bake (a la que espero dedicar una entrada en el futuro).
Lo primero que hacemos es crear una tabla en la base de datos para nuestros enlace. Para ello entramos en phpMyAdmin con el usuario que creamos en el paso de instalación y creamos una tabla. Nos queda algo así:
Hay que destacar algunas características en la tabla creada:
- El nombre de la tabla no es negociable. Es el plural (en inglés) del modelo al que representa.
- La clave primaria
ides obligatoria. El nombre tampoco es negociable. - El campo
createdtambién es de nombre fijo.
En general estas limitaciones son salvables, pero si seguimos el estándar de CakePHP será todo más sencillo y ahorraremos líneas de código.
Lo primero creamos el modelo (por convención lo guardamos en app/models como link.php):
class Link extends AppModel {
var $name = 'Link';
var $validate = array(
'title' => array(
'rule' => array('maxLength', '30'),
'allowEmpty' => false,
'message' => 'Titulo no valido'
),
'url' => array(
'rule' => 'url',
'required' => true,
'message' => 'Debe introducir un email correcto'
)
);
}
Como podemos ver, un modelo en principio es bastante sencillo. La parte que más líneas acapara es la validación, una de las facilidades que nos aporta CakePHP. En este caso, al título le damos una longitud máxima y a la url le forzamos a que sea una url
.
Ahora vamos con el controlador (igualmente por convención lo guardamos en app/controllers como links_controller.php):
class LinksController extends AppController {
var $name = 'Links';
function add() {
if (!empty($this->data)) {
if ($this->Link->save($this->data)) {
$this->flash('Enlace añadido.','/links');
}
}
}
function index() {
$this->set('links', $this->Link->findAll());
}
}
El controlador probablemente sea la parte más compleja de nuestra aplicación. En este caso hemos definido dos acciones, una que hemos llamado index (acción por defecto de ese controlador) que nos mostrará todos los enlaces y add que nos permitirá añadir un enlace. Destacamos los siguientes puntos:
- Con
!empty($this->data)comprobamos si hemos recibido el formulario de añadir enlace con información. - Cuando se hace referencia a
$this->Link, estamos haciendo referencia al modelo, y utilizamos sus métodos, tanto para guardar un nuevo enlace (save) como para recuperar los enlaces existentes (find('all')). - Con
$this->set()le pasamos información a la vista correspondiente. $this->flash()es un método bastante utilizado en CakePHP para hacer una transición a otra página tras mostrar un mensaje.
Por último necesitaremos dos vistas, una por cada acción del controlador. Ambas las pondremos en app/views/links y serán add.thtml e index.thtml. Primero vemos el index:
<h1>Enlaces disponibles</h1>
<?php foreach ($links as $link): ?>
<a href="<?php echo $link['Link']['url']; ?>"><?php echo $link['Link']['title']; ?></a>
Añadido: <?php echo $link['Link']['created']; ?>
<?php endforeach; ?>
<?php echo $html->link('Añadir enlace', '/links/add');?>
Destacamos la utilización de $links suministrado por el controlador mediante el método set(). También la utilización del Helper html, en este caso para crear un enlace ($html->link()).
Y finalmente la vista de añadir:
Añadir
<?php
echo $form->create('Link');
echo $form->input('title');
echo $form->input('url');
echo $form->end('Agregar');
?>
Aquí destacamos la utilización del Helper de formularios, para la creación de todos los elementos del formulario.
Si ahora apuntamos nuestro navegador al proyecto CakePHP y añadimos /links/ al final de la ruta (en CakePHP una ruta /controller/action hace referencia al controlador controller método action) nos dirigimos a la acción por defecto del controlador links y obtenemos:
Destacamos algunas cosas:
- El diseño de cabecera y pie nos lo ha colocado CakePHP. Esto lo modificaremos creando un layout en /app/views.
- En la parte inferior nos aparece información sobre las querys ejecutadas. Esto se debe al nivel de debug que tenemos seleccionado. Mientras desarrollamos yo aconsejo no cambiarlo. Para un sitio en producción lógicamente pondremos el nivel a 0.
- Tenemos un enlace que apunta a la acción
adddel controlador links (/links/add). - La lista de enlaces está vacía. Claro, ¡CakePHP tampoco hace magia!.
Si pinchamos en el enlace de añadir, vemos nuestro formulario de añadir:
Podemos hacer algunas pruebas de la validación que CakePHP nos aporta y que nosotros hemos indicado en el modelo (incluido el mensaje que aparece). Cuando finalmente introducimos unos valores válidos llegamos a:
Esta es la pantalla que nos ha generado el $this->flash() que vimos en el controlador. Su funcionamiento también depende del nivel de debug. En el nivel de desarrollo, el mensaje que aportamos es un enlace a la ruta también indicada en $this->flash().
Finalmente ya tenemos el listado de enlaces con contenido:
En la siguiente entrada de esta serie, continuaremos con nuestro gestor de favoritos: solucionaremos algunas pegas que han aparecido hasta ahora, añadiremos comentarios sobre los enlaces de la lista y alguna cosa más.
¡Manteneos en línea!
Actualización: Segunda parte
25 Comments Add your own
Leave a Comment
Some HTML allowed:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <pre> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>
Trackback this post | Subscribe to the comments via RSS Feed









1.
RubenijE | 11 Julio 2008 at 1:32 am
Impresionante lo facil que puede ser hacer un administrador de contenido.
Muy bueno el articulo.
2.
Miguel | 11 Julio 2008 at 9:16 am
Gracias por tu comentario. Estoy preparando una segunda parte que espero que también te guste.
3.
La abuela | 14 Julio 2008 at 11:14 pm
Buenas quisiera saber si pueden ayudarme.
Siguiendo tu tutorial me da el siguiente error:
http://localhost/cake_1.1.19.6305/links/add
Añadir
Notice: Undefined variable: form in /var/www/cake_1.1.19.6305/app/views/links/add.thtml on line 3
Fatal error: Call to a member function create() on a non-object in /var/www/cake_1.1.19.6305/app/views/links/add.thtml on line 3
4.
Miguel | 17 Julio 2008 at 7:49 am
Hola la abuela, perdona, pero hasta hoy no había visto tu comentario porque se había marcado como spam.
El error se puede deber a que en esta entrada se ha utilizado la versión 1.2 de CakePHP (en el post de instalación también).
Las diferencias entre ambas versiones son bastantes, y se recomienda la utilización de la versión 1.2 aunque siga marcada como Release Candidate.
Prueba con la 1.2 y me cuentas.
Por cierto, gracias por leerme.
5. Mi primera aplicación CakePHP (2) « Tus ceros y mis unos | 22 Agosto 2008 at 10:50 am
[...] Agosto 2008 Continuando con lo visto en la primera parte de la entrada, vamos a solucionar algunas pequeñas pegas de nuestra [...]
6.
Jordi | 23 Octubre 2008 at 12:21 pm
Hola,
Estoy aprendiendo a utilizar el CakePHP y estoy investigando sitios en Internet que hablan de él. Encontré este sitio y he seguido este post para crear el ejemplo: ¡funciona!, y me mantendré en línea. Por cierto, estoy documentando, por decirlo así, mi proceso de aprendizaje en http://www.tutorialcakephp.wordpress.com.
Tengo varias dudillas:
1. ¿Alguien sabe cómo funciona “la magia” de la validación de los datos, en CakePHP? ¿Por qué, cuando se declara el atributo $validate, en la clase Link, todo funciona? ¿Quién se encarga de esto?
2. En algunos sitios hablan más bien que en otros de CakePHP: ¿qué fama creéis que se merece este framework? Estaría bien contar con alguna comparación entre los disponibles…
¡Un saludo a todos! Nos leemos.
7.
Miguel | 23 Octubre 2008 at 1:17 pm
Hola Jordi, gracias por tu comentario. Ya he visitado tu página y te digo lo mismo: me mantendré en línea.
Respecto a tus dudas:
1. La magia se lleva a cabo en la función invalidFields de Model. Se puede consultar fácilmente a través del API de CakePHP y siempre resulta instructivo.
2. Mi opinión es que utilizar cualquier framework que nos facilite algo las tareas siempre tiene algo de coste en rendimiento. Si yo pienso hacer un sitio con cientos de miles de visitas, seguramente tendré que optimizar código, ya utilice CakePHP o PHP a secas. Eso siempre costará más si utilizo algo que no entiendo como funciona. Por ello cuanto más se usa CakePHP (o cualquiera) más se debe conocer sus tripas.
Un saludo y nos leemos.
8.
Jordi | 23 Octubre 2008 at 5:08 pm
Hola Miguel,
Es la primera vez que entro en el API de CakePHP y acabo de ver el código del método invalidFields… Vaya tela. Por cierto, y hablando de APIs, me acabas de recordar que tengo que ver cómo se trabaja con la de Google Maps en Cake.
Un saludo y nos leemos!
9.
Jordi | 27 Octubre 2008 at 3:41 pm
Hola,
Tengo una dudilla que está un poco fuera de este ejemplo (o no, no lo sé). Imaginaos que queremos grabar los datos de un usuario pero en varios pasos: en el primer paso, preguntamos al usuario por su nombre y apellido; en el segundo paso, preguntamos al usuario, en una pantalla nueva, su dirección de correo y su contraseña; finalmente, en una tercera pantalla, preguntamos al usuario por su dirección y teléfono.
Pues bien: ¿cómo se hace esto?, jeje. La magia de Cake está hecha de tal forma que cada vista se asocia a una acción del controlador, pero, en este ejemplo, tenemos 3 vistas distintas para la acción añadir. ¿Cómo se arma esto?
Muchas gracias y un saludo
10.
Miguel | 27 Octubre 2008 at 3:58 pm
Buenas Jordi, pues como dices no se puede hacer de forma ultrasencilla. Se podría ir guardando en la sesión y sólo grabar en el último paso o alguna otra estrategia.
De todas maneras he visto este componente para wizards que te puede ser útil (aunque yo no lo he probado).
11.
tutorialcakephp | 29 Octubre 2008 at 7:35 pm
Buenas Miguel,
De momento no me atrevo a probarlo; cuando tenga algo de tiempo a ver si lo hago y te cuento.
Al final he ido guardando variables de sesión, y he definido varias vistas para varios métodos de un mismo controlador. Al final, cada método hace la siguiente llamada:
$this->render(‘vista’,'layout’);
Es decir, presenta su vista y su layout correspondiente. Yo lo he hecho así, vaya, con esta llamada al final de cada acción. ¿Sabes Miguel si esta es la forma correcta de hacer esto?
Muchas gracias y estamos en línea!
12. Herramientas CakePHP: Scaffolding y bake « Tus ceros y mis unos | 12 Febrero 2009 at 7:34 pm
[...] vamos a servir de la aplicación que desarrollamos en “Mi primera aplicación CakePHP” (parte 1 y parte 2), que era un pequeño gestor de enlaces. Empezamos con el scaffolding, que podemos [...]
13.
Emmanuel | 19 Febrero 2009 at 8:35 pm
hola miguel! soy nuevo en cake, y necesito realizar un sistema de ABM, simple, solo 3 tablas relacionadas.
Tendrias algun ejemplo de como hacerlo???
Gracias!!
14.
Miguel | 19 Febrero 2009 at 8:51 pm
Lo siento Emmanuel pero no tengo ningún ejemplo así. En principio dependería de cómo se relacionaran las tablas.
Por cierto, ¿ABM es Agent Based Model?
Gracias por leerme y si te puedo ayudar en algo (un poco más concreto si es posible
) no dudes en preguntar.
15.
Emmanuel | 21 Febrero 2009 at 7:11 pm
Miguel: Si, la verdad no fui muy claro. ABM es; Altas-Bajas-Modificaciones.
Ya cree la base de datos, son 3 tablas (clientes-habitaciones – reservas)
Los campos son; CLIENTES: Id – nombre – tel – numero_de_hab – fecha_ingr – fecha_salida
HABITACIONES: id- tipo – precio – estado
RESERVAS: id_clien – num_habitacion – fecha_ingr – fecha_salida
Las relaciones serian: * 1 cliente puede tener muchas reservas
* 1 Habitacion tiene 1 cliente
* 1 Habitacion tiene estado libre, ocupada o reservada.
Eso seria basicamente lo que tengo, de alli surgen mis dudas, de como realizar consultas a la Base de Datos, como asi tambien, agregar, eliminar o modificar registros de la misma.
Espero ser un poco mas claro y me puedas dar una mano…
Desde ya muchas gracias!
16.
Miguel | 23 Febrero 2009 at 4:10 pm
Hola de nuevo Emmanuel.
Entonces ABM es lo que se viene llamando en inglés CRUD (Create, Read, Update, Delete).
Mi consejo sería que crearas tu BBDD siguiendo las convenciones CakePHP.
Después puedes crear los modelos usando bake y crear un prototipo usando scaffolding.
Para realizar todas las consultas a BBDD ten en cuenta que si los modelos y tablas están correctamente relacionados CakePHP te devolverá el resultado esperado, es decir, que si haces un find de reservas tendrás automáticamente todos los datos del cliente y la habitación.
Espero que te ayude. No dudes en seguir preguntando tus dudas.
17.
Guille | 21 Abril 2009 at 12:02 pm
Muy bueno el blog, felicitaciones!
consulta:
En la clase “LinksController” con la funcion flash() puedo hacer que luego de unos segundos despues de mostrar el mensaje “Enlace Añadido” se redireccione a la pagina principal “/links”?
muchas gracias.
18.
Miguel | 21 Abril 2009 at 1:19 pm
Hola Guille muchas gracias por tu comentario.
Flash hace exactamente lo que dices si el nivel debug está en cero (lo modificas en config/core.php en tu aplicación). Digamos que es el funcionamiento en producción.
Le puedes pasar un tercer parámetro que es el tiempo en segundos que muestra el mensaje antes de redirigir (1 segundo por defecto).
$this->flash('Enlace añadido.','/links');También le podrías modificar el layout del mensaje modificando flash.ctp.
19.
walter | 2 Mayo 2009 at 12:39 am
Hice todos los pasos y cree todos los archivos que describiste pero cuando voy a la dirección
http://localhost/cake/links/add
me sale el error: HTTP 404 No encontrado
20.
Miguel | 4 Mayo 2009 at 9:24 am
Hola Walter,
¿la parte de instalación de CakePHP también la has hecho?.
Ten en cuenta también que la parte “cake” de la url es el directorio de apache en el que tengo yo instalada mi aplicación. No sé si tú lo tendrás igual.
Saludos y gracias por leerme.
21.
Billy Camacho | 23 Junio 2009 at 5:50 am
Hi Miguel Ingresando al mundo de cakephp, me sale error Missing Controller
Error: LinksController could not be found.
Error: Create the class LinksController below in file: app\controllers\links_controller.php
Que puede esta fallado??
Gracias por la ayuda
22.
Billy Camacho | 23 Junio 2009 at 5:58 am
Miguel, la perseverancia es una virtud, gracias de todos modos ya esta operativo
Gracias
23.
Miguel | 23 Junio 2009 at 8:30 am
Hoila Billy, ¡no me has dado tiempo ni a mirarlo!.
Me alegro que te funcione. Gracias por tu comentario.
24.
Adlonie | 4 Septiembre 2009 at 2:59 pm
Hola Miguel,
Queria hacerte una pregunta general sobre frameworks, puesto que salta a la vista que entiendes bastante del tema.
Es la primera vez que hago un portal Web comercial, pero si tengo experiencia en Ingenieria del software. He creado mi marco de trabajo siguiendo el patron MVC; las clases html llaman a ajax (prototype), y estas a scripts php que utilizan PHP OO (clases del modelo) Por otra parte tengo acceso a BD con el patron de acceso a datos y el factoria
Me han recomendado utilizar cake php. Le he estado echando un vistazo y me resulta muy pero que muy tedioso. ¿Merece la pena aprenderlo? ¿Se puede hacer aplicaciones de calidad sin utilizar frameworks? ¿Tu que opinas?
25.
Miguel | 5 Septiembre 2009 at 6:15 pm
Muchas gracias por tu comentario Adlonie.
Mi opinión es que por supuesto que se pueden realizar aplicaciones de calidad sin utilizar ningún frameworks. De hecho parece que tu aplicación está bien pensada.
Un framework te aporta un diseño bien pensado (como Cake PHP) y una implementación que sabes que prueba mucha gente y que está en revisión constante.
Pero también te ata en algunos aspectos y realizar algunas tareas “sencillas” se puede complicar bastante al relizarlas dentro del framework.
Si tienes ya la base de tu aplicación yo seguiría sin utilizar Cake, pero mirar un poco Cake te puede ayudar con ideas de diseño e implementación y a lo mejor te animas a utilizarlo en tu próxima aplicación.
Un saludo y espero que te sirva de ayuda.