Está en la página 1de 62

INSTITUTO TECNOLÓGICO SUPERIOR CODILLERA

Tema: Framework CAKEPHP

Integrantes:
 Criollo Stalin
 Jahuaco Dario
 Molina Omar
 Tuquinga Jorge

Fecha: Quito, octubre 26 del 2018

Jornada: Nocturna

Nivel: 5to. Semestre

Paralelo: A
1. Introducción

Conocer el framework cake php para saber cómo se utiliza, como funciona y en que
puede servir al momento de desarrollar para llegar a facilitar el desarrollo de la programación.

2. Objetivos

2.1 Objetivo General

Consultar el framework cake php para sus usos y aplicaciones para facilitar el
desarrollo.

2.2 Objetivos Específicos

Adquirir conocimiento de framework php.

Identificar sus usos, beneficios.

3. Framework CAKEPHP

¿Qué es CAKEPHP Framework y porqué hay que utilizarlo?

CakePHP es un marco de desarrollo [framework] rápido para PHP, libre, de código


abierto. Se trata de una estructura que sirve de base a los programadores para que éstos puedan
crear aplicaciones Web. Nuestro principal objetivo es que puedas trabajar de forma estructurada
y rápida, sin pérdida de flexibilidad.
Con CakePHP el desarrollo web ya no es monótono porque ofrecemos las herramientas
para que empieces a escribir el código que realmente necesitas: la lógica específica de tu
aplicación. Consigue una copia de CakePHP, empieza con lo verdaderamente importante y no
reinventes la rueda cada vez que te incorpores a un nuevo proyecto.
CakePHP tiene un equipo de desarrolladores y una comunidad activos, lo que añade
valor al proyecto. Con CakePHP, además de no tener que reinventar la rueda, el núcleo de tu
aplicación se mejora constantemente y está bien probado. (https://book.cakephp.org/, n.d.)
 Esta es una lista breve con las características de las que disfrutarás al utilizar
CakePHP:
 Comunidad activa y amistosa
 Licencia flexible
 Compatible con PHP4 y PHP5
 CRUD integrado para la interacción con la base de datos
 Soporte de aplicación [scaffolding]
 Generación de código
 Arquitectura Modelo Vista Controlador (MVC)
 Despachador de peticiones [dispatcher], con URLs y rutas personalizadas y
limpias
 Validación integrada
 Plantillas rápidas y flexibles (sintaxis de PHP, con ayudantes[helpers])
 Ayudantes para AJAX, Javascript, formularios HTML y más
 Componentes de Email, Cookie, Seguridad, Sesión y Manejo de solicitudes
 Listas de control de acceso flexibles
 Limpieza de datos
 Caché flexible
 Localización
 Funciona en cualquier subdirectorio del sitio web, con poca o ninguna
configuración de Apache

¿Cómo se utiliza?

Si reconoces un error, algo que está incompleto, algo que no ha sido cubierto en su
totalidad, o algo que simplemente no está escrito a tu gusto, aquí te explicamos cómo puedes
ayudar:
 Inicia sesión en el Cookbook utilizando tu cuenta de Bakery. ¡Cualquiera puede
conseguir una cuenta!
 Envía tus ediciones o adiciones para su revisión, utilizando semántica HTML
válida.
 Sigue el progreso de tus envíos usando los feeds rss o revisa al día siguiente para
ver tus cambios aprobados.

`Las aplicaciones CakePHP bien escritas siguen el patrón de diseño de software MVC
(Modelo-Vista-Controlador). Programar utilizando MVC consiste en separar la aplicación en tres
partes principales. El modelo representa los datos de la aplicación, la vista hace una presentación
del modelo de datos, y el controlador maneja y enruta las peticiones [requests] hechas por los
usuarios.

Figura 1 MVC

La figura 1 muestra un ejemplo sencillo de una petición [request] MVC en CakePHP. A


efectos ilustrativos, supongamos que un usuario llamado Ricardo acaba de hacer clic en el enlace
“¡Comprar un pastel personalizado ahora!” de la página inicial de la aplicación.
 Ricardo hace clic en el enlace apuntando
a http://www.ejemplo.com/pasteles/comprar , y su navegador hace una petición al
servidor web.
 El despachador comprueba la URL de la petición (/pasteles/comprar), y le pasa la
petición al controlador adecuado.
 El controlador realiza lógica de aplicación específica. Por ejemplo, puede comprobar si
Ricardo ha iniciado sesión.
 El controlador también utiliza modelos para acceder a los datos de la aplicación. La
mayoría de las veces los modelos representan tablas de una base de datos, aunque
también pueden representar entradas LDAP, canales RSS, o ficheros en el sistema. En
este ejemplo, el controlador utiliza un modelo para buscar la última compra de Ricardo
en la base de datos.
 Una vez que el controlador ha hecho su magia en los datos, se los pasa a la vista. La
vista toma los datos y los deja listos para su presentación al usuario. La mayoría de las
veces las vistas en CakePHP vienen en formato HTML, pero una vista puede ser
fácilmente un PDF, un documento XML, o un objeto JSON, dependiendo de tus
necesidades.
 Una vez que el objeto encargado de procesar vistas en CakePHP ha utilizado los datos
del controlador para construir una vista completa, el contenido se devuelve al navegador
de Ricardo.
Casi todas las peticiones a tu aplicación seguirán este patrón básico. Más adelante,
vamos a completar algunos detalles específicos de Cake, así que, por favor, ten esto en cuenta a
medida que avanzamos.

Beneficios

¿Por qué utilizar MVC? Porque es un patrón de diseño de software probado y se sabe
que funciona. Con MVC la aplicación se puede desarrollar rápidamente, de forma modular y
mantenible. Separar las funciones de la aplicación en modelos, vistas y controladores hace que la
aplicación sea muy ligera. Estas características nuevas se añaden fácilmente y las antiguas toman
automáticamente una forma nueva.
El diseño modular permite a los diseñadores y a los desarrolladores trabajar
conjuntamente, así como realizar rápidamente el prototipado. Esta separación también permite
hacer cambios en una parte de la aplicación sin que las demás se vean afectadas.
Aunque lleva algún tiempo acostumbrarse a construir aplicaciones así, estamos seguros
de que, una vez construyas tu primera aplicación con CakePHP, no querrás volver a hacerlo de
otra forma. (https://book.cakephp.org/, n.d.)
¿Qué se necesita?

Requerimientos

Servidor HTTP. Por ejemplo: Apache. Preferiblemente con mod_rewrite, pero no


requerido.
PHP 4.3.2 o superior. Si, CakePHP funciona genial en PHP 4 y 5.
Técnicamente no se requiere un motor de base de datos, pero nos imaginamos
que la mayoría de las aplicaciones usarán uno. CakePHP soporta una gran variedad de
motores de almacenamiento:
 MySQL (4 o superior)
 PostgreSQL
 Firebird DB2
 Microsoft SQL Server
 Oracle
 SQLite
 ODBC
 ADOdb

Preparándose para Instalar

CakePHP es rápido y fácil de instalar.Los requisitos mínimos son un servidor web y


una copia de Cake, ¡solo eso! Aunque este manual se enfoca primariamente en la
configuración sobre Apache (por que es el usado comúnmente), Tu puedes configurar
Cake para correr sobre la mayoría de servidores web, tales como, LightHTTPD o bien
Microsoft IIS. Preparar la instalación consta de los siguientes pasos:
 Descargue CakePHP
 Configure su servidor para manejar php si es necesario
 Chequee los permisos de los archivos
 Obteniendo CakePHP
Hay dos principales maneras de obtener una copia limpia de CakePHP. Puedes
descargar una copia comprimida (zip/tar.gz/tar.bz2) de la página web principal, o puedes
obtener el código desde el repositorio git.
Para descargar la última release principal de CakePHP, dirígete a la página
web https://cakephp.org y haz clic en el enlace “Download Now”.
Todas las releases actuales están alojadas en CakeForge. Este site también
contiene enlaces a muchos otros proyectos en CakePHP, incluyendo plugins y
aplicaciones para CakePHP. Las releases de CakePHP estásn disponibles
enhttp://cakeforge.org/projects/cakephp.
Se crean nightly builds alternativas que incluyen parches y mejoras al minuto
(bueno, al día). Estas pueden ser accedidas desde la página principal de descargas
aquí: https://cakephp.org/downloads/index/nightly. Para actualizaciones realmente al
minuto, puedes obtener el código directamente de la rama de desarrollo del repositorio git
aquí:http://code.cakephp.org/source.

Permisos

CakePHP usa el directorio /app/tmp para diferentes operaciones, como almacenar


descripciones de los modelos, vistas en cache, información de sesiones, entre otros.
Por ello, asegúrate que el directorio /app/tmp de tu instalación de Cake tenga
permisos de escritura por el usuario del servidor web

Instalación

Instalar CakePHP puede ser tan simple como colocar el directorio en el servidor, o
tan complejo y flexible como necesites. Esta sección cubrirá los tres tipos principales de
instalación para CakePHP: desarrollo, producción y avanzado
Desarrollo: fácil para iniciar, los URL de la aplicación incluyen el nombre del
directorio, y es menos seguro.
Producción: Requiere la capacidad de configurar el servidor web para definir el
“document root”, muy seguro.
Avanzado: Con cierta configuración, permite ubicar los directorios clave de
CakePHP en diferentes partes del sistema de archivos, para compartir una misma
instalación de CakePHP para varias aplicaciones.
Desarrollo

Usar una instalación de desarrollo es el método más rápido para montar Cake.
Este ejemplo te ayudará a instalar una aplicación de CakePHP y hacerla disponible
en http://www.ejemplo.com/cake_1_2/. Asumimos para el fin de este ejemplo que tu raíz
de documentos está establecido a /var/www/html.
Descomprime los contenidos del archivo Cake en /var/www/html. Ahora tienes una
carpeta en tu raíz de documentos con un nombre dependiente de la versión que te has
descargado (p.ej. cake_1.2.0.7962). Renombra esta carpeta a cake_1_2. Tu configuración
de desarrollo será como la siguiente en el sistema de archivos:
/var/www/html
cake_1_2
/app
/cake
/vendors
.htaccess
/index.php
README
Si tu servidor web está configurado correctamente, deberías encontrar tu aplicación
de Cake accesible en http://www.ejemplo.com/cake_1_2/.

Producción

Una instalación de producción es una manera más flexible de instalar Cake. Usar
este método permite que un dominio entero se comporte como una aplicación CakePHP
única. Este ejemplo te ayudará a installar Cake en cualquier sitio de tu sistema de ficheros
y ponerlo disponible en http://www.ejemplo.com. Tener en cuenta que esta instalación
puede requerir los privilegios para cambiar el DocumentRoot (raíz de documentos) en
servidores web Apache.
Descomprime los contenidos del archivo Cake en un directorio a tu elección. Por
motivos de ejemplo, asumimos que escoges instalar Cake en /cake_install. Tu
configuración de producción se verá de la siguiente manera en el sistema de ficheros:
/cake_install/
/app
/webroot (este directorio es el establecido con la directiva DocumentRoot)
/cake
/vendors
/.htaccess
/index.php
/README
Los desarrolladores que usan Apache deberán establecer la
directiva DocumentRoot para el dominio a:
DocumentRoot /cake_install/app/webroot
Si tu servidor web está configurado correctamente, deberías encontrar tu aplicación
Cake accesible en http://www.ejemplo.com.

Instalación Avanzada

Existen situaciones en las que querrás colocar los directorios de CakePHP en


lugares diferentes del sistema de archivos. Esto puede ser debido a restricciones de un
servidor compartido, o quizás simplemente deseas que algunas de tus aplicaciones
compartan las mismas librerías de Cake. Esta sección describe cómo esparcir los
directorios de CakePHP sobre un sistema de archivos.
En primer lugar, date cuenta que existen tres partes principales de una aplicación
Cake:
Las librerías principales(core) de CakePHP, en /cake.
El código de tu aplicación, en /app.
El webroot de la aplicación, normalmente en /app/webroot.
Cada uno de estos directorios puede ser ubicado en cualquier lugar de tu sistema
de archivos, a excepción del webroot, que debe ser accesible por el servidor web. Incluso
puedes mover el directorio webroot fuera de tu carpeta app siempre que le indiques a Cake
en donde lo has puesto.
Para configurar tu instalación de Cake, necesitarás hacer algunos cambios a
/app/webroot/index.php. Hay tres constantes que deberás editar: ROOT, APP_DIR,
y CAKE_CORE_INCLUDE_PATH.
ROOT debe contener la ruta del directorio que contiene la carpeta app (es decir, el
padre de APP_DIR).
APP_DIR debe ser establecida con el nombre(base) de tu carpeta app.

CAKE_CORE_INCLUDE_PATH debe contener la ruta al directorio que contiene las


librerías de Cake.
Vamos a mostrar un ejemplo para ver cómo quedaría una instalación avanzada en
la práctica. Imagina que quiero configurar CakePHP para que funcione de esta manera:
Las Librerías de CakePHP serán ubicadas en /usr/lib/cake.
El webroot de mi aplicación será /var/www/misitio/.
El directorio app de mi aplicación estará en /home/yo/misitio.
Dada esta configuración, necesitaré editar mi webroot/index.php (el cual terminará
ubicado en /var/www/misitio/index.php, en este ejemplo) para que sea así:
// /app/webroot/index.php (codigo parcial, sin comentarios)

if (!defined('ROOT')) {
define('ROOT', DS.'home'.DS.'yo');
}

if (!defined('APP_DIR')) {
define ('APP_DIR', 'misitio');
}

if (!defined('CAKE_CORE_INCLUDE_PATH')) {
define('CAKE_CORE_INCLUDE_PATH', DS.'usr'.DS.'lib');
}
Es recomendable utilizar la constante DS en lugar de barras inclinadas para
delimitar las rutas de los archivos. Esto evita errores por falta de archivo como resultado de
usar el delimitador equivocado, y además hace tu código más portable.

Rutas de Clase Adicionales

Ocasionalmente es útil compartir clases MVC entre aplicaciones en el mismo


sistema. Si quieres el mismo controler en dos aplicaciones, puedes usar el archivo
bootstrap.php de CakePHP para traer estas clases adicionales a la escena.
En el archivo bootstrap.php, define algunas variables especiales para que
CakePHP sepa otros lugares en donde buscar clases MVC:
$viewPaths = array();
$controllerPaths = array();
$modelPaths = array();
$helperPaths = array();
$componentPaths = array();
$behaviorPaths = array();
$pluginPaths = array();
$vendorPaths = array();
$localePaths = array();
$shellPaths = array();
Cada una de estas variables especiales pude ser establecida a un array de rutas
absolutas en el sistema de archivos donde las clases adicionales pueden ser encontradas
cuando se solicite. Asegúrate que cada ruta contenga una barra inclinada (o
preferiblemente la constante DS) al final.

Apache y mod_rewrite (y .htaccess)

A pesar de que CakePHP está hecho para funcionar con mod_rewrite sin tocar
nada, y normalmente así es, hemos notado que algunos usuarios tienen dificultades para
lograr que todo funcione correctamente en sus sistemas.
Aquí hay unas cuantas cosas que puedes probar para conseguir que funcione
correctamente. Primero mira en tu httpd.conf (asegúrate de estar editando el httpd.conf del
sistema y que no es httpd.conf específico de un usuario o del site).
Asegúrate que la reescritura .htaccess esté permitida y que AllowOverride esté
establecido a All para el DocumentRoot adecuado. Deberías ver algo similar a:
#
# Cada directorio al que tiene acceso Apache puede ser
configurado en
# función de qué servicios y características están permitidas
y/o
# desactivadas en dicho directorio (y sus subdirectorios).
#
# Primero, configuramos "por defecto" para que sea un conjunto
de
# características muy restrivo.
#
<Directory />
Options FollowSymLinks
AllowOverride All
# Order deny,allow
# Deny from all
</Directory>
Asegúrate de estar cargando el módulo mod_rewrite correctamente. Debes ver
algo como:
LoadModule rewrite_module libexec/apache2/mod_rewrite.so
En muchos sistemas esto estará comentado (comenzando la línea con #) por
defecto, así que sólo tendrás que quitar los símbolos # del principio.
Tras realizar los cambios reinicia Apache para estar seguro de que las opciones de
configuración están activas.
Asegúrate de que tus ficheros .htaccess están en los directorios correctos. Esto
puede pasar durante la copia porque algunos sistemas operativos consideran los archivos
que comienzan por ‘.’ como ocultos y por lo tanto no los copian.
Asegúrate de que tu copia de CakePHP es de las sección de descargas de
nuestro site o nuestro repositorio GIT, y que ha sido desempaquetado correctamente
verificando que existen los ficheros .htaccess:
En el directorio raíz de Cake (necesita ser copiado al directorio, esto redirige todo a
tu aplicación de Cake):
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule ^$ app/webroot/ [L]
RewriteRule (.*) app/webroot/$1 [L]
</IfModule>
En el directorio app de Cake (será copiado por bake):
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule ^$ webroot/ [L]
RewriteRule (.*) webroot/$1 [L]
</IfModule>
En el directorio webroot de Cake (será copiado a tu webroot de la aplicación por
bake):
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
</IfModule>
En muchos servicios de hosting (GoDaddy, 1and1), tu servidor web está realmente
siendo servido desde un directorio de usuario que ya utiliza mod_rewrite. Si estás
instalando CakePHP en un directorio de usuario
(http://ejemplo.com/~nombreusuario/cakephp), o en cualquier otra estructura que ya
utilice mod_rewrite necesitarás añadir sentencias RewriteBase a los archivos .htaccess que
utiliza CakePHP (/.htaccess, /app/.htaccess, /app/webroot/.htaccess)
Esto puede ser añadido a la misma sección con la directiva RewriteEngine , así, por
ejmplo, tu archivo .htaccess en el webroot devería ser así:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
</IfModule>
Los detalles de esos cambios dependen de tu configuración, y pueden incluir cosas
adicionales que no están relacionadas con Cake. Consulta la documentación online de
Apache para más información.

Lighttpd y mod_magnet

Aunque Lighttpd cuenta con un módulo de reescritura, no es equivalente al


mod_rewrite de Apache. Las funcinalidades completas de mod_rewrite se reparten entre el
mod_rewrite de Lighttp, el mod_magnet y el mod_proxy.
Sin embargo, CakePHP, mayoritariamente necesita mod_magnet para redirigir las
solicitudes a fin de trabajar con bastantes URLs
Para utilizar bastantes URLs con CakePHP y Lighttp, sustituye este lua script en
/etc/lighttpd/cake.
-- pequeña funcion helper
function file_exists(path)
local attr = lighty.stat(path)
if (attr) then
return true
else
return false
end
end
function removePrefix(str, prefix)
return str:sub(1,#prefix+1) == prefix.."/" and str:sub(#prefix+2)
end

-- prefijo sin la barra


local prefix = ''

-- la magia ;)
if (not file_exists(lighty.env["physical.path"])) then
-- fichero aún desaparecido, pasarlo al 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=" ..
request_uri
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["physical.rel-path"]
end
end
-- fallthrough pondrá de nuevo la solucititud en el bucle lighty
-- eso significa que tenemos la manipulación 304 de forma gratuita. ;)
If you run your CakePHP installation from a subdirectory, you must set prefix =
‘subdirectory_name’ in the above script.
Then tell Lighttpd about your vhost:
$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/"

# además piensa como coger los ficheros vim tmp fuera


url.access-deny = (
"~", ".inc", ".sh", "sql", ".sql", ".tpl.php",
".xtmpl", "Entries", "Repository", "Root",
".ctp", "empty"
)
}
Pretty URLs en nginx

nginx es un servidor popular que, del mismo modo que Lighttpd, consume menos
recursos del sistema. Su inconveniente es que no utiliza ficheros .htaccess como Apache y
Lighttpd, por lo que es necesario crear esas reescrituras de URLs en la configuración de
site-available. Dependiendo de tu configuración, necesitarás modificar esto, pero como
mínimo necesitarás que PHP se ejecute como instancia de FastCGI.
server {
listen 80;
server_name www.ejemplo.com;
rewrite ^(.*) http://ejemplo.com$1 permanent;
}

server {
listen 80;
server_name ejemplo.com;

access_log /var/www/ejemplo.com/log/access.log;
error_log /var/www/ejemplo.com/log/error.log;

location / {
root /var/www/ejemplo.com/public/app/webroot/;
index index.php index.html index.htm;
if (-f $request_filename) {
break;
}
if (-d $request_filename) {
break;
}
rewrite ^(.+)$ /index.php?q=$1 last;
}
location ~ .*\.php[345]?$ {
include /etc/nginx/fcgi.conf;
fastcgi_pass 127.0.0.1:10005;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME
/var/www/ejemplo.com/public/app/webroot$fastcgi_script_name;
}
}

URL Rewrites on IIS7 (Windows hosts)

IIS7 no tiene soporte nativo para archivos .htaccess. Aunque hay agregados que
proporcionan ese soporte, también pueden importarse las reglas htacess en IIS para usar
las reescritura nativa de CakePHP. Para hacer esto, siga los siguientes pasos:
Use el Instalador de Plataforma Web de Microsoft para instalar el Módulo URL
Rewrite 2.0.
Crear un nuevo archivo en el folder de CakePHP llamado web.config
Usando Notepad u otro editor XML-seguro, copiar el siguiente código en el archivo
web.config recién creado.
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="Redirect static resources"
stopProcessing="true">
<match url="^(ico|img|css|files|js)(.*)$" />
<action type="Rewrite" url="app/webroot/{R:1}{R:2}"
appendQueryString="false" />
</rule>
<rule name="Imported Rule 1" stopProcessing="true">
<match url="^(.*)$" ignoreCase="false" />
<conditions logicalGrouping="MatchAll">
<add input="{REQUEST_FILENAME}"
matchType="IsDirectory" negate="true" />
<add input="{REQUEST_FILENAME}"
matchType="IsFile" negate="true" />
</conditions>
<action type="Rewrite" url="index.php?url={R:1}"
appendQueryString="true" />
</rule>
<rule name="Imported Rule 2" stopProcessing="true">
<match url="^$" ignoreCase="false" />
<action type="Rewrite" url="/" />
</rule>
<rule name="Imported Rule 3" stopProcessing="true">
<match url="(.*)" ignoreCase="false" />
<action type="Rewrite" url="/{R:1}" />
</rule>
<rule name="Imported Rule 4" stopProcessing="true">
<match url="^(.*)$" ignoreCase="false" />
<conditions logicalGrouping="MatchAll">
<add input="{REQUEST_FILENAME}"
matchType="IsDirectory" negate="true" />
<add input="{REQUEST_FILENAME}"
matchType="IsFile" negate="true" />
</conditions>
<action type="Rewrite" url="index.php?url={R:1}"
appendQueryString="true" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>
También es posible usar la funcionalidad Import en el módulo URL Rewrite de IIS
para importar reglas directamente del archivo .htaccess de CakePHP’s en root, /app/, and
/app/webroot/ - aunque puede ser necesaria alguna edición para lograr que funcionen.
Cuando se importan las reglas de esta manera, IIS automáticamente creará el archivo
web.config para nosotros.
Una vez que se cree el archivo web.config con las reglas de reescritura aceptadas
por IIS, los vínculos, css, js y redireccionamiento en CakePHP deben funcionar
correctamente.

Enciéndelo

Muy bien, ahora veamos a CakePHP en acción. Dependiendo de la configuración


que hayas usado, deberías apuntar tu navegador
a http://example.com/ o http://example.com/mi_aplicacion/. En este punto, se te
presentará la vista de bienvenida de CakePHP por omisión, y un mensaje que indica el
estado de conexión con la base de datos.
¡Felicidades! Ya estás listo para crear tu primera aplicación CakePHP
Configuración
Configurar aplicaciones CakePHP es pan comido. Despues de instalar CakePHP,
crear una aplicación web básica solo requiere aplicar la configuración de una base de
datos. Existen, otras configuraciones opcionales, que puedes realizar con el objetivo de
aprovechar las ventajas de la arquitectura flexible de CakePHP. Tu puedes agregar
facilmente elementos al núcleo de CakePHP, configurar URL personalizadas y definir
inflexiones.

Configuración de Base de Datos

CakePHP espera que los detalles de configuración de la base de datos estén en


app/config/database.php. Un ejemplo de configuración puede encontrarse en el archivo
app/config/database.php.default. Esta configuración debería verse como sigue:
var $default = array('driver' => 'mysql',
'persistent' => false,
'host' => 'localhost',
'login' => 'cakephpuser',
'password' => 'c4k3roxx!',
'database' => 'mi_proyecto',
'prefix' => '');
El arreglo de configuración $default es el utilizado a menos que se especifique algún
otro en la propiedad $usDbConfig de los modelos. Por ejemplo, si mi aplicación tiene
aplicaciones legadas adicionales a la que se va a utilizar por defecto, podría utilizarla en mis
modelos creando un nuevo arreglo de configuración $legada que sea similar a $default, y
asignado var $useDbConfig = ‘legada’; en los modelos correspondientes.
Rellena cada para clave/valor en el arreglo de configuración, como mejor se ajuste a tus
necesidades
Clave Valor
driver El nombre del controlador de base de datos que se desea utilizar.
Ejemplo: mysql, postgres, sqlite, pear-nombrededriver, adodb-nombrededriver,
mssql, oracle, odbc.
persistent Si se debe usar o no una conexión persistente a la base de datos.
host El nombre de servidor de la base de datos (o dirección IP).
login El nombre de usuario para la cuenta.
password La contraseña para la cuenta.
database Nombre de la base de datos a usar para la conexión
prefix El texto que prefija cada nombre de tabla en la base de datos. Útil si se
(opcional) comparte la base de datos con varias aplicaciones. Dejar vacío si no se desea
ninguno.
port El puerto TCP o socket Unix a usarse para la conexión con el servidor
(opcional) de base de datos.
encoding Indica la codificación de caracteres a usar para enviar las sentencias
SQL al servidor.
schema Usado en la configuración de PostgreSQL para especificar el esquema a
utilizar.
Nota que los prefijos son para las tablas, no para los modelos. Por ejemplo, si creaste
una tabla join para tus modelos Torta y Sabor, esta debe llamarse prefijo_sabor_torta
(no prefijo_sabor_prefijo_torta), y asignar la clave prefix con ‘prefijo_’.
A este punto, pudieras querer echar un vistazo a las Convenciones de CakePHP ,
enunciadas en el apéndice de este manual. Nombrar correctamente tus tablas (y algunas
columnas) según las convenciones puede librarte de mucho trabajo de configuración. Por
ejemplo, si nombras una tabla como tortas, el modelo Torta y el controller TortasController, todo
funcionará automáticamente si necesidad de tu intervención. Por convención, utiliza guiones
bajos, minúsculas, y nombres en plural para los nombres de tus tablas - por ejemplo: reposteros,
reposterias, sabores.

Configuración del Core

La configuración de la aplicación en CakePHP se encuentra en /app/config/core.php.


Este archivo es una colección de definiciones de variables Configure y definiciones de constantes
que determinan como ha de comportarse la aplicación. Antes de sumergirse en cada una de estas
directivas, necesitarás familiarizarte con Configure, la clase de registro de configuraciones de
CakePHP

La Clase de Configuración

A pesar de que muy pocas cosas necesitan configuración en CakePHP, a veces es útil
tener tus propias reglas de configuración para tu aplicación. En el pasado seguramente habrías
definido alguno de estos valores creando constantes en varios archivos. Hacerlo de esa manera te
obligaría a incluir estos archivos cada vez que desees utilizarlos
La nueva clase Configure de CakePHP puede ser utilizada para guardar y recuperar
valores específicos de la aplicación o de tiempo de ejecución. Se cuidadoso, esta clase permite
almacenar cualquier cosa en ella, para luego usarla en cualquier lugar de tu código: una tentación
segura para romper el patrón MVC con el cual fue diseñado CakePHP. El objetivo principal de la
clase Configure es mantener centralizadas las variables que pueden ser compartidas entre varios
objetos. Recuerda tratar de mantener la filosofía de “convención sobre configuración” y así no
terminarás rompiendo la estructura MVC que se ha diseñado
Esta clase actúa como un singletón, y sus métodos pueden ser llamados desde cualquier
lugar en tu aplicación, en un contexto estático
<?php Configure::read('debug'); ?>
Métodos de la Clase Configure

write
write(string $clave, mixed $valor)
Utiliza write() para almacenar datos en la configuración de la aplicación
Configure::write('Empresa.nombre','Pizza, Inc.');
Configure::write('Empresa.lema','Pizza para tu cuerpo y alma');
Nota el uso de la notación punto en el parámetro $clave. Puedes utilizar esta
notación para organizar tus configuraciones dentro de grupos lógicos
El ejemplo anterior pudo ser escrito en una sola llamada:
Configure::write(
'Empresa',array('nombre'=>'Pizza, Inc.','lema'=>'Pizza para
tu cuerpo y alma')
);
Puedes utilizar Configure::write(‘debug’, $int) para cambiar entre desarrollo y
producción dentro de la ejecución de tu programa. Esto es especialmente útil para
interacciones AMF o SOAP donde la información de depuración puede ocasionar problema
de parseo.
read
read(string $clave = 'debug')
Se usa para leer datos de configuración de la aplicación. Por defecto devuelve el
importante valor de “debug” (nivel de depuración). Si se especifica una clave, los datos
correspondientes son devueltos. Usando nuestros anteriores ejemplos de write(),
podemos leer esos datos de vuelta:
Configure::read('Empresa.nombre'); //devuelve: 'Pizza, Inc.'
Configure::read('Empresa.lema'); //devuelve: 'Pizza para tu
cuerpo y alma'

Configure::read('Empresa');

//devuelve:
array('nombre' => 'Pizza, Inc.', 'lema' => 'Pizza para tu cuerpo
y alma');
delete
delete(string $clave)
Se usa para borrar información de configuración de la aplicación.
Configure::delete('Empresa.nombre');
load
load(string $path)
Usa este método para cargar información de configuración desde una archivo
específico.
// /app/config/mensajes.php:
<?php
$config['Empresa']['nombre'] = 'Pizza, Inc.';
$config['Empresa']['lema'] = 'Pizza para tu cuerpo y alma';
$config['Empresa']['telefono'] = '555-55-55';
?>

<?php
Configure::load('mensajes');
Configure::read('Empresa.nombre');
?>
Cada clave-valor de la configuración está representado en el archivo con la
variable $config. Cualquier otra variable que aparezca en el archivo será ignorada por la
función load().
version
version()
Devuelve la versión de CakePHP de la aplicación actual.

Variables de Configuración Principales de CakePHP

La clase Configure se usa para manejar un conjunto de variables de configuración


de CakePHP. Estas variables pueden ser encontradas en app/config/core.php. Abajo se
encuentra una descripción de cada variable y cómo afecta tu aplicación CakePHP
Variable de Descripción
Configuración
debug Cambia el nivel de depuración de cake
0 = Modo produción. No produce ninguna salida. 1 = Muestra
los error y warnings. 2 = Muestra los error, warnings, y consultas SQL 3
= Muestra los error, warnings, consultas SQL, y volcado completo del
Controller.
App.baseUrl Descomenta esta definición si no deseas utilizar el
mod_rewrite de Apache. No te olvides de eliminar los archivos .htaccess
también.
Routing.admin Descomenta esta definición si deseas utilizar las rutas admin
de CakePHP. Asigna la variable al nombre de la ruta que te gustaría
utilizar. Más adelante se explicará en detalle.
Cache.disable Cuando se asigna true, el cache se deshabilita para toda la
aplicación.
Cache.check Si se asigna true, habilita el cache de las vistas. También es
necesario activar el cache en los controllers, pero esta variable habilita la
detección de dichas configuraciones.
Session.save Le indica a CakePHP qué mecanismo de almacenamiento de
sesiones se debe utilizar
php = Utiliza el almacenamiento por defecto de php cake =
Guarda los datos de sesión en /app/tmp database = Guarda los datos en
una tabla de la base de datos. Asegúrate de cargar el archivo SQL
ubicado en /app/config/sql/sessions.sql.
Session.table El nombre de la tabla (sin incluir el prefijo) que guarda los
datos de la sesión.
Session.database El nombre de la base de datos que guarda los datos de sesión.
Session.cookie El nombre del cookie utilizado para hacer seguimiento de las
sesiones.
Session.timeout El tiempo base de validez de la sesión en segundos. El valor
real depende de la variable Security.level
Session.start Inicia automáticamente la sesión cuando se asigna true.
Session.checkAgent Cuando se asigna false, Las sesiones de CakePHP no se
asegurarán de que el “user agent” del usuario no cambie entre peticiones.
Security.level El nivel de seguridad de CakePHP. El tiempo de validez de la
sesión definido en ‘Session.timeout’ se multiplica de acuerdo a lo
siguiente.
Valores válidos: ‘high’ = x 10 ‘medium’ = x 100 ‘low’ = x 300
Security.salt Una palabra aleatoria usada en sumas de seguridad.
Acl.classname, Variables usadas para las Listas de Control de Acceso de
Acl.database CakePHP. Lee el capítulo de listas de control de acceso para más
información.
Nota: La configuración de Cache también puede ser encontrada en el archivo
core.php — Más adelante cubriremos este tema.
La clase Configure puede ser utilizada para leer y escribir valores durante la ejecución
del programa. Esto puede ser especialmente útil si desea deshabilitar el nivel de deburacion
(“debug”) para una sección limita de lógica en tu aplicación, por ejemplo

Constantes de Configuración

A pesar de que la mayoría de las opciones de configuración se manejan con la clase


Configure, existen unas pocas constantes que utiliza CakePHP durante su ejecución.
Constante Descripción
LOG_ERROR Constante de error. Usada para diferenciar entre registros de
depuración y registros de error. Actualmente PHP solo soporta LOG_DEBUG.

La Clase App

Cargar clases adicionales se ha vuelto mucho más sencillo con CakePHP. En versiones
anteriores existían funciones diferentes para cargar una clase dependiendo de su tipo. Estas
funciones han sido reemplazadas, ahora toda la carga de clases debería hacerse a través de el
método App::import(). Éste método te asegura que una clase ha sido cargada sólo una vez, que
las clases que extiende se hayan cargado apropiadamente, y resuelve las rutas de ubicación
automáticamente en la gran mayoría de los casos
Usando App::import()
App::import($type, $name, $parent, $search, $file, $return);
A primera vista App::import parece complejo, sin embargo, en la mayoría de los casos
es suficiente con tan sólo dos parámetros.
Importando librerías del Core

Las librerías del Core, como Sanitize y Xml pueden ser cargadas mediante:
App::import('Core', 'Sanitize');
Lo anterior hará que la clase Sanitize esté disponible para su uso.

Importando Controladores, Modelos, Ayudantes, Comportamientos y

Componentes

Todas las clases relacionadas con la aplicación pueden ser importadas con
App::import(). Los siguientes ejemplos muestran cómo hacerlo:
Cargando Controladores
App::import('Controller', 'MyController');
Llamando a App::import es equivalente a require. Es importante darse cuenta que
la clase posteriormente necesita ser inicializada.
<?php
// Lo mismo que require('controllers/users_controller.php');
App::import('Controller', 'Users');

// Necesitamos cargar la clase


$Users = new UsersController;

// If we want the model associations, components, etc to be


loaded
$Users->constructClasses();
?>
Cargando Modelos
App::import('Model', 'MyModel');
Cargando Componentes [Components]
App::import('Component', 'Auth');
Cargando Comportamientos [Behaviors]
App::import('Behavior', 'Tree');
Cargando Ayudantes[Helpers]
App::import('Helper', 'Html');
Cargando Ayudantes[Helpers]
App::import('Helper', 'Html');

Cargando desde Plugins

Cargar clases en plugins funciona casi igual que cargar clases ubicadas en el Core o en
la aplicación principal, a excepción de que debe especificarse el nombre del plugin donde reside
la clase a cargar.
App::import('Modelo', 'NombrePlugin.Comentario');

Cargando Archivos de Terceros

La función vendor() ha sido reemplazada. Los archivos de terceros deben ser cargados
también mediante App::import(). La sintaxis y los argumentos adicionales son levemente
diferentes, debido a que los archivos de terceros y su estructura pueden variar inmensamente, y
no todos los archivos de terceros contienen clases.
Los siguientes ejemplos ilustran cómo cargar archivos de terceros en diferentes rutas y
estructuras. Los archivos de terceros deben estar ubicados en cualquiera de los
directorios vendor.
Ejemplos de archivos de terceros
Para cargar vendors/geshi.php
App::import('Vendor', 'geshi');
Para cargar vendors/flickr/flickr.php
App::import('Vendor', 'flickr/flickr');
Para cargar vendors/cierto.nombre.php
App::import('Vendor', 'CiertoNombre', array('file' =>
'cierto.nombre.php'));
Para cargar vendors/services/well.named.php
App::import('Vendor', 'WellNamed', array('file' =>
'services'.DS.'well.named.php'));
Configuración de Rutas

El enrutamanieto permite hacer una relación entre URLs y acciones de los controller.
Fue añadido a CakePHP para hacer más bonitos los URLs, más configurables, y más flexibles.
Usar el mod_rewrite de Apache no es un requisito para utilizar el enrutamiento, pero hará lucir
mucho mejor tu barra de direcciones.
Las rutas en CakePHP 1.2 han sido mejoradas y pueden llegar a ser muy poderosas.

Enrutamiento por Defecto

Antes de que aprendas a configurar tus propias rutas, deberías saber que CakePHP viene
configurado con un conjunto de rutas por defecto. Estas rutas te llevarán bastante lejos en
cualquier aplicación. Puedes acceder a una acción directamente desde el URL colocando su
nombre en la petición. También puedes pasar parámetros a las acciones de tus controladores
usando el URL.
Patron URL de las rutas por defecto:
http://example.com/controlador/accion/param1/param2/param3
El URL /articulos/ver dirige a la acciónver() action del ArticulosController, y
/productos/listaCompleta dirige a la accion to the lista_completa() de ProductosController. Si no
se especifica ninguna acción en el URL, se asume que se trata de la acción index().
La configuración inicial de enrutamiento permite pasar parámetros a tus acciones
usando el URL. Una petición para /articulos/ver/25 sería equivalente a llamar ver(25) en el
ArticulosController, por ejemplo.

Parámetros con Nombre

Algo novedoso en CakePHP 1.2 es la habilidad de usar parámetros con nombre (named
parameters). Puedes nombrar parámetros y enviar sus valores usando el URL. Una petición para
/articulos/ver/titulo:primer+articulo/categoria:general resultaría en una llmada a la accion view()
de ArticulosController. En dicha acción, puedes encontrar los valores del título y la categoría
dentro de $this->passedArgs[‘titulo’] and $this->passedArgs[‘categoria’] respectivamente.
Algunos ejemplos que resuman las rutas por defecto puede resultar útil.
URL: /monos/saltar
Dirige a: MonosController->saltar();
URL: /productos
Dirige a: ProductosController->index();

URL: /tareas/ver/45
Dirige a: TareasController->ver(45);

URL: /donaciones/ver/recientes/2001
Dirige a: DonacionesController->ver('recientes', '2001');

URL: /contenidos/ver/capitulo:modelos/seccion:asociaciones
Dirige a: ContenidosController->ver();
$this->passedArgs['capitulo'] = 'modelos';
$this->passedArgs['seccion'] = 'asociaciones';

Definir Rutas

Definir tus propias rutas te permite definir cómo va a responder tu aplicación cuando se
solicite un URL determinado. Tus rutas deben ser definidas en el archivo /app/config/routes.php
usando el método Router::connect().
El método connect() toma hasta tres parámetros: el patron de URL que deseas hacer
coindicir, los valores por defecto para los elementos de enrutamient propios, y expresiones
regulares que ayuden al enrutador a hacer coincidir elementos en el URL.
El formáto básico para una definición de ruta es:
Router::connect(
'URL',
array('nombreParam' => 'valorPorDefecto'),
array('nombreParam' => 'expresionRegular')
)
El primer parámetro es usado para decirle al enrutador qué tipo de URL estás tratando
de controlar. El URL es una cadena de caracteres separadas por barras inclinadas (slash), pero
también pueden contener el un comodín comodín (*) o elementos de enrutamiento propios
(Elementos de URL prefijados con el caracter dos puntos ”:”). Usar un comodín le indica al
enrutador qué tipos de URL quieres hacer coincidir, y especificar elementos de enrutamiento te
permite recolectar parámetros para las acciones de tus controladores
Una vez que hayas especificado un URL, debes utilizar los últimos dos parámetros del
método connect() para decirle a CakePHP que hacer con esa petición una vez que ha sido
seleccionada la regla adecuada. El segundo parámetro es una arreglo asociativo. Las claves de
este arreglo deben ser nombradas como los elementos de enrutamiento en el URL, o los
elementos por defecto, que son, :controller, :action y :plugin. Los valores en este arreglo son los
valores por omisión para cada una de las claves. Veamos algunos ehjemplos básicos antes de
empezar a usar el tercer parámetro de connect()
Router::connect(
'/pages/*',
array('controller' => 'pages', 'action' => 'display')
);
Esta ruta se encuentra en el archivo routes.php distribuido con CakePHP (linea 40). Esta
ruta coincide con los URL que comienzan con /pages/ y delega a la acción display() de
PagesController el manejo de la petición. La petición /pages/productos puede sería dirigida a
PagesController->display(‘productos’), por ejemplo.
Router::connect(
'/mujeres',
array('controller' => 'productos', 'action' => 'mostrar', 5)
);
Este segundo ejemplo muestra como usar el segundo parámetro de connect() para
definir parámetros por omisión. Si construiste un sitio que muestra productos para diferentes
categorías de clientes, puedes considerar el hacer una ruta. Esto te ayuda a crear el enlace
/mujeres en lugar de /productos/mostrar/5
Para tener flexibilidad adicional, puedes especificar elementos de enrutamiento propios.
Hacer esto te da el poder de definir lugares en el URL donde los parámentros para las acciones
deben residir. Cuando se hace una petición, los valores para estos elementos propios se
encuentran en $this-gt;params del controlador. Estos son diferentres de los parametros con
nombre, y esta es la diferencia: los parmámetros con nombre (/controlador/accion/nombre:valor)
se encuentran en $this->passedArgs, mientras que los elementos propios de enrutamiento se
encuentran en $this->params. Cuando defines un elemento propio de enrutamiento, también
necesitas especificar una expresión regular. Esto le indica a CakePHP cómo reconocer si el URL
está bien formado o no.
Router::connect(
'/:controller/:id',
array('action' => 'ver'),
array('id' => '[0-9]+')
);
Este ejemplo sencillo muestra cómo crear una manera sencilla de ver registros desde
cualquier controlador accediendo a un URL que luce como /mincontrolador/id. El URL
suministrado a connect() especifica dos elementos de enrutamiento, :controller e :id, El primer
elemento es uno que viene por defecto con CakePHP, así que el enrutador sabe cómo reconocer
nombres de controladores en el URL. El elemento :id es propio, y debe ser clarificado
especificando una expresión regular en el tercer parámetro de conenct(). Esto le dice a CakePHP
cómo reconocer el ID en el URL en contraposición a cualquier otra cosa que esté allí, como el
nombre de una acción.
Una vez que hayas definido esta ruta, solicitar /manzanas/5, sería lo mismo que solicitar
/manzanas/ver/5. Ambos harán una llamada al método ver() de ManzanasController. Dentro del
método ver(), podrías acceder al id en $this->params[‘id’].
unejemplo más y serás un profesional del enrutador.
Router::connect(
'/:controller/:year/:month/:day',
array('action' => 'listar', 'day' => null),
array(
'year' => '[12][0-9]{3}',
'month' => '(0[1-9]|1[012])',
'day' => '(0[1-9]|[12][0-9]|3[01])'
)
);
Puede parecer un poco enredado, pero muestra lo poderosas que pueden ser las
rutas. El URL suministrado tiene cuatro elemento. El primero ya debe resultarte familiar: el
elemento que le dice a CakePHP que se trata de un nombre de controlador.
A continuación, vamos a especificar algunos valores por defecto. Sin importar el
controlador, queremos que la acción listar() sea llamada. Asignamos el parámetro day (día,
que es el cuarto elemento en el URL) a null, para marcarlo como opcional.
Finalmente especificamos algunas expresiones regulares que coindidiran con
años, meses y días en su forma numérica.
Una vez definda, esta ruta coindcidirá con /articulos/2007/02/01,
/escritos/2004/11/16 y /productos/2001/05 (¿recuerdas que el parametro day era
opcional?), enviando la petición a listar() de sus respectivos controladores, con los
parámetros de fecha definidos en $this->params.

Pasando parámetros a la acción

Asumiendo que tu acción fue definida como se muestra a continuación, y que desea
acceder a los argumentos usando $articuloID en lugar de $this->params[‘id’], simplemente
agrega el tercer parámetro de Router::connect().
// some_controller.php
function ver($articuloID = null, $slug = null) {
// mi codigo aqui...
}

// routes.php
Router::connect(
// E.g. /blog/3-CakePHP_Rocks
'/blog/:id-:slug',
array('controller' => 'blog', 'action' => 'ver'),
array(
// el orden importa, puesto que esto enviará ":id" como
el parámetro $articuloID de tu acción.
'pass' => array('id', 'slug'),
'id' => '[0-9]+'
)
)
Y ahora, gracias a las capacidades de enrutamiento inverso, puedes usar el arreglo de url
que se muestra a continuación y Cake sabrá cómo formar el URL tal como fue definido en las
rutas.
// ver.ctp
// Esto va a devolver un lik a /blog/3-CakePHP_Rocks
link('CakePHP Rocks', array(
'controller' => 'blog',
'action' => 'view',
'id' => 3,
'slug' => Inflector::slug('CakePHP Rocks')
)) ?>

Rutas con prefijos

Muchas cplicaciones requieren una zona administrativa donde los usuarios


privilegiados puedan hacer cambios. Estos es comunment hecho a través de un URL
especial como /admin/usuarios/editar/5 . En CakePHP, las rutas admin pueden ser
habilitadas en el archivo core.php asignando la ruta para Routing.admin.
Configure::write('Routing.admin', 'admin');
En tu controlador, cualquier acción que empiece por admin_ será llamada. Usando
nuestro ejemplo de usuarios, el nombre de la acción de nuestro UsuariosController debe
ser admin_editar
Puedes usar el enrutador para usar prefijos propios para usos más allá de la
administraión
Router::connect('/perfiles/:controller/:action', array('prefix'
=> 'perfiles'));
Cualquier llamada a la sección de perfiles buscará el prefijo perfiles_ en las
llamadas a métodos. Nuestro ejemplo de usuarios tendría una estructura de URL que
luciría como /perfiles/usuarios/editar/5, lo cual invocaría el
métodoperfiles_editar del UsuariosController. también es importante reordar que usar
el Ayudante HTML para construir tus enlaces te ayudará a mantener los prefijos. Este es un
ejemplo de un enlace usando el ayudante HTML
echo $html->link('Editat tu perfil', array('controller' =>
'usuarios', 'action' => 'perfiles_editar'));
Puedes utilizar múltiples prefijos de ruta para crar una muy flexible estructura de
URL para tu aplicación

Enrutamiento por defecto

Antes de que leas como configurar tus rutas, deberías saber que CakePHP incluye
algunas por defecto. El enrutamiento en CakePHP te ofrece mucho más que cualquier otra
aplicación. Puedes acceder directamente a cualquier acción poniéndola solo en la URL. Puedes
enviar también variables a la acción a través de la URL.
Patrones de enrutamiento por defecto:
http://example.com/controller/action/param1/param2/param3
La URL /posts/view enruta hacia la accion view() del controlador PostsController y
/products/viewClearance enruta hacia la accion view_clearance() del controlador
ProductsController. Si la acción no esta definida en la URL, el método index() es asumido por
defecto.
El enrutamiento por defecto te permite enviar parámetros a la acción a través de la URL.
Una petición hacia /posts/view/25 sería equivalente a llamar a la acción view(25) en el
controlador PostsController.

Passed arguments

Los argumentos pasados son argumentos adicionales o segmentos de rutas que se usan
al hacer una solicitud. Generalmente se usan para pasar parámetros a los métodos de los
controladores.
http://localhost/calendars/view/recent/mark
En el ejemplo anterior, recent y mark son argumentos que se pasan
a CalendarsController::view(). Los argumentos pasados se dan a los controladores de tres
formas. Primero, como argumentos al método de acción llamado, segundo estan disponibles
en $this->params['pass'] como una matriz indexada numericamente. Por último, existe$this-
>passedArgs disponible de la misma manera que la segunda forma. Al utilizar rutas
personalizadas pueden pasarse ciertos parámetros junto con los argumentos pasados.
Ver ‘Pasando Argumentos a una acción’ para más información.
Argumentos del método de acción llamado
CalendarsController extends AppController{
function view($arg1, $arg2){
debug($arg1);
debug($arg2);
debug(func_get_args());
}
}
Aqui tendremos:
recent
mark
Array
(
[0] => recent
[1] => mark
)
$this->params[‘pass’] como matriz indexada numericamente
debug($this->params['pass'])
Aqui tendremos:
Array
(
[0] => recent
[1] => mark
)
$this->passedArgs como matriz indexada numericamente
debug($this->passedArgs)
Array
(
[0] => recent
[1] => mark
)
$this->passedArgs también puede contener parámentros Nombrados como una
matriz mixta con los argumentos pasados.

Parámetros con nombre

Una nueva característica en CakePHP 1.2 es la posibilidad de setear nombres de


parámetros y su valor por la URL. Una petición a /posts/view/title:first+post/category:general
resultaría en una llamada a la acción view() del controlador PostsController. En esta acción,
podrás encontrar los valores para title y category dentro de $this->passedArgs[‘title’] y $this-
>passedArgs[‘category’] respectivamente.
Algunos ejemplos que pueden ser de utilidad.
Acceder a la acción jump() del controlador MonkeysController desde la
URL:

URL: /monkeys/jump
Enrutado: MonkeysController->jump();

URL: /products
Enrutado: ProductsController->index();

URL: /tasks/view/45
Enrutado: TasksController->view(45);

URL: /donations/view/recent/2001
Enrutado: DonationsController->view('recent', '2001');

URL: /contents/view/chapter:models/section:associations
Enrutado: ContentsController->view();
$this->passedArgs['chapter'] = 'models';
$this->passedArgs['section'] = 'associations';

Pasando parámetros a las acciones

Asumiendo que tu action fue definida así y quieres acceder los argumentos
usando $articleID en vez de $this->params['id'], tan solo agrega un array extra en el 3er
parámetro de Router::connect().
// some_controller.php
function view($articleID = null, $slug = null) {
// some code here...
}

// routes.php
Router::connect(
// E.g. /blog/3-CakePHP_Rocks
'/blog/:id-:slug',
array('controller' => 'blog', 'action' => 'view'),
array(
// el orden es importante ya que esto va a mapear ":id" con
$articleID en tu action
'pass' => array('id', 'slug'),
'id' => '[0-9]+'
)
);
Y ahora, gracias a la capacidad de enrutamiento inverso podrás pasar la url como se
muestra abajo y Cake sabrá como formar la URL como se definió en los routers.
// view.ctp
// esto devolverá un link a /blog/3-CakePHP_Rocks
<?php echo $html->link('CakePHP Rocks', array(
'controller' => 'blog',
'action' => 'view',
'id' => 3,
'slug' => Inflector::slug('CakePHP Rocks')
)); ?>

Prefix Routing

Muchas aplicaciones necesitan una sección administrativa donde los usuarios con
privilegios puedan hacer cambios. Con frecuencia, esto se hace con una URL especial como
/admin/users/edit/5. En CakePHP, el admin routing puede activarse dentro del archivo de
configuración del core ajustando la ruta de administración para Routing.admin.
Configure::write('Routing.admin', 'admin');
En tu controlador, será llamada cualquier acción con un prefijo admin_. Recurriendo a
nuestro ejemplo de usuarios, acceder a la URL /admin/users/edit/5 debería llamar al
método admin_edit de nuestro UsersController pasando 5 como primer parámetro.
Puedes mapear la URL /admin a tu acción admin_index del pages controller usando la
ruta
Router::connect('/admin', array('controller' => 'pages',
'action' => 'index', 'admin' => true));
Puedes configurar el Router usado múltiples prefijos:
Router::connect('/profiles/:controller/:action/*',
array('prefix' => 'profiles', 'profiles' => true));
Cualquier llamada a la sección Profiles buscaría el prefijo profiles_ en las llamadas a
los métodos. Nuestro ejemplo tendría una URL como /profiles/users/edit/5 que llamaría al
método profiles_edit en el UsersController. Es también importante recordar que usar el
HTML helper para construir tus enlaces, te ayudará a mantener las llamadas a los prefijos. He
aquí cómo construir este enlace usando el HTML helper:
echo $html->link('Edit your profile', array('profiles' => true,
'controller' => 'users', 'action' => 'edit', 'id' => 5));
Puedes ajustar múltiples rutas con prefijos usando esta metodología para crear una
estructura de URL flexible para tu aplicación.
Rutas y plugins

Las rutas a Plugins utilizan la clave plugin. Puedes crear enlaces que apunten a un
plugin siempre que añadas la clave plugin al array de la url.
echo $html->link('New todo', array('plugin' => 'todo',
'controller' => 'todo_items', 'action' => 'create'));
Por el contrario, si la petición activa es un plugin y quieres crear un enlace que no tiene
plugin, puedes hacerlo como sigue.
echo $html->link('New todo', array('plugin' => null,
'controller' => 'users', 'action' => 'profile'));
Al poner plugin => null le estás diciendo al Router que quieres crear un enlace que no
forma parte de un plugin.

Extensiones de archivo

Para manejar diferentes extensiones de archivo con tus rutas, necesitas una línea extra
en el archivo de configuración de rutas:
Router::parseExtensions('html', 'rss');
Esto le dirá al router que retire las extensiones de archivo coincidentes y que procese
entonces el resto..
Si quieres crear una url como /page/title-of-page.html podrías crear tu ruta como se
explica a continuación:
Router::connect(
'/page/:title',
array('controller' => 'pages', 'action' => 'view'),
array(
'pass' => array('title')
)
);
Para crear enlaces que se mapeen a esas rutas simplemente usamos:
$html->link('Link title', array('controller' => 'pages',
'action' => 'view', 'title' => Inflector::slug('text to slug', '-'),
'ext' => 'html'))

Inflexiones Propias

Las convenciones de nomenclatura de CakePHP pueden ser muy buenas. Nombras la


tabla de base de datos “usuarios”, tu modelo “Usuario”, tu controlador “UsuariosController” y
todo funcionará automáticamente. La forma en que CakePHP sabe como atar unas cosas a otras
es a través de las inflexiones de palabras entre formas en singular y plural.
Hay ocasiones, sobre todo para usuarios de habla hispana, en que encontrarás
situaciones donde el inflector de CakePHP no funcione como lo esperas. Si CakePHP no es
capaz de reconocer tu Reloj o Ciudad, editar el archivo de inflexiones propias es la manera de
indicarle a CakePHP que existen otros casos especiales. Este archivo se encuentra en
/app/config/inflections.php.
En este archivo encontrarás seis variables. Cada una de ellas te permite definir a un
grado muy fino el comportamiento de inflexiones de CakePHP.
Variable de Descripción
inflections.php
$pluralRules Este arreglo contienen las expresiones regulares para
pluralizar los casos especiales. Las claves del arreglo son los patrones y
los valores los reemplazos.
$uninflectedPlural Un arreglo que contiene palabras que no han de ser
modificadas para obtener su plural, como la palabra gente o dinero.
$irregularPlural Un arreglo que contiene palabras y su respectivo plural. Las
claves de este arreglo contienen la forma singular y los valores la forma
plural. Este arreglo debe ser utilizado para colocar palabras que no sigan
las reglas definidas en $pluralRules.
$singularRules Igual que $pluralRules, solo que contiene las reglas para
singularizar palabras.
$uninflectedSingular Igual que $uninflectedPlural, solo que este arreglo contiene
las palabras que no tienen singular. Por defecto es igual que
$uninflectedPlural.
$irregularSingular Igual que $irregularPlural, solo que con palabras en forma
singular.

Haciendo Bootstrap de CakePHP

Si tienes necesidades de configuración adicionales, usa el archivo de bootstrap de


CakePHP que se encuentra en /app/config/bootstrap.php. Este archivo es ejecutado
inmediatamente después de el bootstrap propio de CakePHP.
 Este archivo es ideal para un número de tareas comunes:
 Definir funciones de conveniencia
 Definir constantes globales
 Definir rutas adicionales para modelos, controladores, vistas, plugins...
Sé cuidadoso de mantener el patron de diseño MVC cuando agregues cosas al archivo
bootstrap, puede resultar tentador colocar funciones para dar formato a texto allí para luego
usarlas en controladores.
Resiste la tentación. Te lo agradecerás más adelante a ti mismo.
Podrías considerar colocar cosas en la clase AppController. Esta clase en poder de todos
los controladores de la aplicación. AppController es útil para colocar funciones que se ejecutan
antes o después de eventos definidos (callbacks), que serán usados en todos tus controladores.

Controladores

Un controlador (Controller) se usa para manejar la lógica de cierta sección de su


aplicación. Comúnmente, los controladores (Controllers) son usados para manejar la lógica de un
solo modelo (Model). Por ejemplo, si estás construyendo un sitio de una pastelería, podrías tener
un RecetasController y un IngredientesController para manejar las recetas y sus ingredientes. En
CakePHP, los controladores se nombran según el modelo que manejan, y se ponen siempre en
plural.
El modelo Receta es manejado por el RecetasController, el modelo Producto es
manejado por el ProductosController, y así sucesivamente.
Los controladores de su aplicación son sub-clases de la clase AppController de
CakePHP, que a su vez extiende la clase principal Controller. La clase AppController puede ser
definida en /app/app_controller.php y debe contener métodos que son compartidos entre todos
los controladores de su aplicación. AppController es una sub-clase de Controller que es una clase
de la biblioteca estándar de Cake.
Los controladores pueden tener cualquier cantidad de métodos a los que normalmente se
les llama acciones. Las acciones son métodos de controladores en tu aplicación web para
mostrar vistas. Una acción es un único método de un controlador. El Dispatcher de CakePHP
ejecuta acciones cuando una solicitud entrante contiene en su URL el nombre de una acción del
controlador. El controlador estaría ubicado en /app/controllers/recetas_controller.php con el
siguiente contenido:
<?php

# /app/controllers/recetas_controller.php

class RecetasController extends AppController {


function ver($id) {
//la lógica de la acción va aqui...
}

function compartir($cliente_id, $receta_id) {


//la lógica de la acción va aqui...
}

function buscar($query) {
//la lógica de la acción va aqui...
}
}

?>
Para que puedas usar un controlador de manera productiva en tu propia aplicación,
repasaremos algunos de los atributos y métodos provistos por los controladores de CakePHP.
The App Controller

Como se comentó en la introducción, la clase AppController es la clase superior a todos


los controladores de tu aplicación. AppController extiende la clase Controller incluida en la
libreria base de CakePHP. Así, AppController es definida en /app/app_controller.php como:
<?php
class AppController extends Controller {
}
?>
Las propiedades y métodos creados en tu AppController estarán disponibles para todos
los controladores de tu aplicación. Es el sitio ideal para poner el código que será común a todos
los controladpres de tu aplicación. Los Componentes (los cuales veremos después) son lo más
utilizado para el código que se utiliza en la mayoría (pero no necesariamente en todos) los
controladores
Cuando se aplica la herencia a los objetos, CakePHP también realiza un trabajo extra
cuando existen atributos especiales en el controlador, como una lista de componentes o
ayudantes utilizados por un controlador. En estos casos, los arrays del AppControler son
combinados con los arrays de la clase hijo
CakePHP combina las siguientes variables de AppController con los controladores de tu
aplicación:
$components
$helpers
$uses
Por favor, recuerda realizar las llamadas a los callbacks de AppController desde los
controladores de tu aplicación para que todo funcione correctamente:
function beforeFilter(){
parent::beforeFilter();
}

The Pages Controller

El núcleo de CakePHP viene con un controlador por defecto llamado the Pages
Controller (el Controlador de Páginas) (cake/libs/controller/pages_controller.php). La página de
inicio que ves luego de la instalación, es generada utilizando este controlador. Por ejemplo: Sí
creas un archivo de vista app/views/pages/about_us.ctp puedes accesarlo utilizando la
url http://example.com/pages/about_us
Cuando “cocinas” una aplicación utilizando la consola de CakePHP el controlador de
páginas es copiado a tu carpeta app/controllers/ y puedes modificarla a tus necesidades si es
necesario. O simplemente puedes copiar el archivo page_controller.php del núcleo a tu app.
No modifiques directamente NINGUN archivo dentro de la carpeta cake para evitar
problemas futuros en la actualización del núcleo

Atributos del Controlador

Para ver la lista completa de atributos visite la API de CakePHP en la


sección Controller.

$name
Los usuarios de PHP4 deberían empezar la definición de sus controladores con el
atributo $name. Este atributo debería ser asignado con el nombre del controlador. Usualmente
este es simplemente el plural del modelo principal al que el controlador está asociado. Esto
previene algunos problemas de distinción de mayúsculas que tiene PHP4 para los nombres de las
clases.
<?php

# $name Ejemplo de uso del atributo $name

class RecetasController extends AppController {


var $name = 'Recetas';
}

?>

$components, $helpers y $uses


Los siguientes atributos más comunmente utilizados del controlador indican a CakePHP
qué ayudantes (helpers), componentes (components ), y modelos (models ) utilizarás en
conjunción con el controlador actual. Utilizar esos atributos hace que las clases MVC estén
disponibles al controlador como variable de clase($this->ModelName, por ejemplo).
Cada controlador tiene alguna de esas clases disponibles por defecto, así que no
necesitarás configurar tu controlador.
Los controladores tienen acceso a su modelo primario disponible por defecto.
Nuestro RecipesController tendrá disponible la clase modelo Recipe en $this->Recipe, y
nuestro ProductsController también posee el modelo Product en $this->Product .
Los ayudantes (Helpers) Html, Form, y Session están siempre disponibles por
defecto, como lo es SessionComponent . Para aprender más sobre estas clases, no olvides leer
sus respectivas secciones más adelante en este manual.
Veamos cómo decirle a un controlador de CakePHP que planeas utilizar clases MVC
adicionales.
<?php
class RecipesController extends AppController {
var $name = 'Recipes';

var $uses = array('Recipe', 'User');


var $helpers = array('Ajax');
var $components = array('Email');
}
?>
Cada una de estas variables es fusionada con sus valores heredados, por lo tanto no es
necesario (por ejemplo) declarar le ayudante (helper) Form, o cualquier cosa que es declarada
en tu controlador App.

Atributos Relacionados con la Página: “$layout” y “$pageTitle”

Existen unos pocos atributos en los controladores de CakePHP que te dan control sobre
cómo se colocan tus vistas (views ) dentro del diseño (layout).
Al atributo $layout se le puede asignar el nombre de un diseño (layout) guardado
en /app/views/layouts. Especificas un diseño al igualar $layout al nombre del archivo con el
diseño excluyendo la extensión .ctp. Si este atributo no ha sido definido, CakePHP renderiza el
diseño por defecto, default.ctp. Si no has definido un diseño
en /app/views/layouts/default.ctp, el diseño por defecto del núcleo de CakePHP’s será
renderizado.
<?php

// Usando <em>$layout</em> para definir un diseño alternativo

class RecipesController extends AppController {


function quickSave() {
$this->layout = 'ajax';
}
}

?>
También puedes cambiar el título de la página (que está localizado en la barra en la
parte superior de tu navegador) utilizando $pageTitle . Para que esto funcione apropiadamente,
tu diseño (layout) necesita incluir la variable $title_for_layout como mínimo entre las
etiquetas <title> y </title> en la cabecera del documento HTML.
<?php

// Usando <em>$pageTitle</em> para definir el título de la


página

class RecipesController extends AppController {


function quickSave() {
$this->pageTitle = 'Mi título del motor de búsquedas
optimizado';
}
}

?>
También puedes establecer el título desde la vista (view) usando $this-
>pageTitle (Has de incluir la parte $this->; se recomienda, ya que separa la lógica del diseño y
el contenido). Para una página estática has de usar $this->pageTitleen la vista si quieres un
título personalizado.
Si $this->pageTitle no está establecido, se generará automáticamente un título basado
en el nombre del controlador, o el nombre del fichero de la vista en el caso de una página
estática.

El Atributo de Parámetros (“$params”)

Los parámetros del controlador están disponibles en $this->params en tu controlador


de CakePHP. Esta variables es usada para proporcionar acceso a la información sobre la petición
actual. El uso más común de $this->params es obtener acceso a información que ha sido
entregada al controlador a través de las operaciones POST o GET.
form
$this->params['form']
Cualquier dato POST de cualquier formulario se almacena aquí, incluyendo información
también hallada en $_FILES .
admin
$this->params['admin']
Contiene el valor 1 si la acción (action) actual fue invocada mediante enrutamiento
“admin”.
bare
$this->params['bare']
Almacena un 1 si el diseño (layout) actual está vacío; 0 si no.
isAjax
$this->params['ajax']
Almacena un 1 si la petición actual es una llamada ajax; 0 si no. Esta variables sólo se
establece si el componente RequestHandler es usado en el controlador.
controller
$this->params['controller']
Almacena el nombre del controlador actual que está sirviendo la petición. Por ejemplo,
si fue pedida la URL /posts/view/1,$this->params['controller'] será igual a “posts”.
action
$this->params['action']
Almacena el nombre de la acción actual sirviendo la petición. Por ejemplo, si fue pedida
la URL /posts/view/1, entonces$this->params['action'] será igual a “view”.
pass
$this->params['pass']
Almacena la cadena de consulta GET enviada con la petición actual. Por ejemplo, si fue
pedida la URL /posts/view/?var1=3&var2=4, entonces $this->params['pass'] será igual a
”?var1=3&var2=4”.
url
$this->params['url']
Almacena la URL actual pedida, junto con los pares clave-valor de variables get. Por
ejemplo, si se llamó a la URL /posts/view/?var1=3&var2=4, entonces $this-
>params['url'] debería contener:
[url] => Array
(
[url] => posts/view
[var1] => 3
[var2] => 4
)
data
$this->data
Usado para manejar datos POST enviados desde los formularios de FormHelper al
controlador.
// El helper FormHelper es usado para crear un elemento de
formulario:
$form->text('User.first_name');
El cual al ser renderizado, se ve parecido a:
<input name="data[User][first_name]" value="" type="text" />
Cuando el formulario es enviado al controlador mediante POST, los datos aparecen
en this->data
// El valor first_name enviado se puede encontrar aquí:
$this->data['User']['first_name'];
prefix
$this->params['prefix']
Establecido al prefijo de enrutado. Por ejemplo, este atributo contendría la cadena
“admin” durante una petición a /admin/posts/someaction.
named
$this->params['named']
Almacena cualquier parámetro con nombre /clave:valor/ de la cadena de petición de la
URL. Por ejemplo, si se pidió la URL /posts/view/var1:3/var2:4, entonces $this-
>params['named'] debería contener el array:
[named] => Array
(
[var1] => 3
[var2] => 4
)

Otros Atributos

Aunque puedes ojear todos los detalles para todos los atributos del controlador en el
API, hay otros atributos del controlador que merecen sus propias secciones en el manual.
El atributo $cacheAction ayuda en el “cacheado” (caching ) de vistas (views), y el
atributo $paginate es usado para establecer las opciones por defecto de paginado para el
controlador. Para más información sobre cómo utilizar esos atributos, écha un vistazo a sus
respectivas secciones más adelante en este manual.

persistModel

Usado para crear instancias almacenadas en caché de modelos (Models) un uso de


Controlador (Controller). Cuando se coloca en verdadero (true), todos los modelos relacionados
con el controlador (Controller) se almacenan en caché. Esto puede incrementar el desempeño en
muchos casos.

Métodos del Controlador

Para una lista completa de los métodos del controlador y sus descripciones visita el API
de CakePHP. Echa un vistazo ahttps://api.cakephp.org/class/controller .

Interactuando con Vistas

set
set(string $variable, mixed $valor)
El método set() es la principal manera de enviar datos desde tu controlador a tu
vista (view). Una vez que has utilizado set(), la variable puede ser accedida en tu vista.
<?php

// Primero pasas datos desde el controlador:

$this->set('color', 'azul');

// Despueś, en las vista, puedes utilizar el dato:


?>

Has seleccionado <?php echo $color; ?>ar la tarta.


El método set() también toma una array asociativo como primer parámetro. A
menudo, esto puede ser una manera rápida de asignar un conjunto de información a la
vista.
Las claves (keys) serán flexionadas (inflected) antes de ser asignadas a la vista
(‘clave_con_subrayado’ se convierte en ‘claveConSubrayado’, etc.):
<?php

$data = array(
'color' => 'pink',
'type' => 'sugar',
'base_price' => 23.95
);

// hace que $color, $type, y $basePrice


// estén disponibles a la vista:

$this->set($data);

?>
render
render(string $action, string $layout, string $file)
El método render() es llamado automáticamente al final de cada acción de
controlador pedida. Este método lleva a cabo toda la lógica de la vista (usando los datos
que has proporcionado con el método set()), coloca la vista (view) dentro de su diseño
(layout) y lo sirve de vuelta al usuario final.
El fichero de vista por defecto utilizado por render es determinado por convenio.
Por ejemplo, si se pide la acción search() del controlador RecipesController, será
renderizado el fichero de vista en /app/views/recipes/search.ctp.
class RecipesController extends AppController {
function search() {
// Render the view in /views/recipes/search.ctp
$this->render();
}
...
}
A pesar de que CakePHP lo llamará automáticamente (a menos que hayas
establecido $this->autoRender a falso) después de cada lógica de las acciones, puedes
utilizar render para especificar un fichero de vista alternativo indicando un nombre de
acción en el controlador usando $action.
Si $action comienza por ‘/’ se asume que es un fichero de vista o elemento relativo
a la carpeta /app/views. Esto permite el renderizado inmediato de elementos, algo muy útil
en las llamadas ajax.
// Render the element in /views/elements/ajaxreturn.ctp
$this->render('/elements/ajaxreturn');
También puedes especificar un fichero de vista alternativo usando el tercer
parámetro, $file. Cuando estés usando $file, no olvides utilizar unas pocas de las
constantes globales de CakePHP (como VIEWS).
El parámetro $layout te permite especificar el diseño en el que la vista es
renderizada.
Renderizando una vista específica
En tu controlador podrías querer renderizar una vista de otra manera de la que
normalmente se haría. Puedes hacer esto llamando a render() directamente. Una vez que
llamaste a render() CakePHP no tratará de re-renderizar la vista.
class PostsController extends AppController {
function my_action() {
$this->render('custom_file');
}
}
Esto renderizará app/views/posts/custom_file.ctp en vez
de app/views/posts/my_action.ctp

Control de Flujo

redirect
redirect(string $url, integer $status, boolean $exit)
El método de control de flujo que más frecuentemente utilizarás es redirect().
Este método toma su primer parámetro en forma de URL relativa de CakePHP. Por
ejemplo, cuando un usuario ha hecho un pedido satisfactoriamente, probablemente
desearás redirigirle a una ventana de recibo.
function realizarPedidos() {

// La lógina para finalizar el pedido va aquí


if($satisfactorio) {
$this->redirect(array('controller' => 'pedidos',
'action' => 'gracias'));
} else {
$this->redirect(array('controller' => 'pedidos',
'action' => 'confirmar'));
}
}
El segundo parámetro de redirect() te permite definir un código de estado HTTP
que acompañe la redirección. Puede que desees usar 301 (movido permanentemente) o
303 (mirar otro), dependiendo de la naturaleza de la redirección.
El metodo ejecutará exit() tras la redirección a menos que establezcas el tercer
parámetro a false.
flash
flash(string $message, string $url, integer $pause)
Igualmente, el método flash() es usado para redirigir un usuario a una nueva
página tras una operación. El método flash() es diferente en cuanto que muestra un
mensaje antes de enviar al usuario a otra URL.
El primer parámetro debería contener el mensaje a mostrar, y el segundo
parámetro es una URL relativa a CakePHP. CakePHP mostrará el mensaje
en $message durante el número de segundos en $pause antes de reenviar al usuario a otra
página.
Para mensajes flash en la página, cerciónate de echarle un ojo al
método setFlash() del componente SessionComponent.

Retrollamadas (“Callbacks”)

Los controladores de CakePHP vienen con retrollamas (callbacks) empotradas que


puedes usar para insertar lógica justo antes o después de que las acciones del controlador sean
llevadas a cabo.
beforeFilter()
Esta función se ejecuta antes de toda acción en el controlador. Es un lugar práctico para
comprobar una sesión activa o inspeccionar los permisos del usuario.
beforeRender()
Llamada tras la lógica de acción del controlador, pero antes de que la vista es
renderizada. Este callback no es utilizado a menudo, pero puedes necesitarlo si estás llamando
a render() manualmente antes del final de una acción dada.
afterFilter()
Llamada tras toda acción del controlador.
afterRender()
Llamada tras haber sido renderizada una acción.
CakePHP también soporta callbacks relacionados con el scaffolding.
_beforeScaffold($metodo)
$metodo es el nombre del método llamado, por ejemplo: index, edit, etc.
_afterScaffoldSave($metodo)
$metodo es el nombre del método llamado tras edit o update.
_afterScaffoldSaveError($metodo)
$metodo es el nombre del método llamado tras edit o update.
_scaffoldError($metodo)
$metodo es el nombre del método llamado, por ejemplo: index, edit, etc.

Otros Métodos Útiles

constructClasses
Este método carga los modelos requeridos por el controlador. El proceso de carga
es realizado por CakePHP normalmente, pero hay que tener a mano este método cuando
se accede a los controladores desde una perspectiva diferente. Si necesitas CakePHP en
un script de línea de comando o algún otro uso externo, constructClasses() será útil.
referer
Devuelve la URL remitente de la petición actual. Ver `referer
<https://en.wikipedia.org/wiki/Referer>`_ en la wikipedia para más información.
disableCache
Usado para indicarle al navegador del usuario que no guarde en caché los
resultados de la petición actual. Esto es diferente que guardar en caché una vista (view
caching), tratado en un capítulo posterior.
postConditions
postConditions(array $datos, mixed $operadores, string $bool, boolean $exc
lusivo)
Usa este método para convertir un conjunto de datos de modelo recibidor mediante
POST (de inputs compatibles con HtmlHelper) en un conjunto de condiciones de búsqueda
para un modelo. Esta función ofrece un atajo rápido para la construcción de la lógica de
búqueda. Por ejemplo, un usuario administrativo puede querer buscar pedidos para saber
qué elementos necesitan ser enviados. Puedes utilizar los
ayudantes FormHelper y HtmlHelper para crear un formulario rápido basado en el modelo
Pedido. Entonces, una acción de un controlador puede usar los datos recibidos desde ese
formulario para encauzar las condiciones de búsqueda:
function index() {
$o = $this->Pedidos->findAll($this->postConditions($this-
>data));
$this->set('pedidos', $o);
}
Si $this->data[‘Pedido’][‘destino’] es igual a “Old Towne Bakery”, postConditions
convierte esa condición en un array compatible para ser usado en un método Model-
>findAll(). En este caso, array(“pedido.destino” => “Old TowneBakery”) .

Si deseas usar un operador SQL distinto entre términos, proporciónalos usando el


segundo parámetro.
/*
contenidos de $this->data
array(
'Pedido' => array(
'num_items' => '4',
'referrer' => 'Ye Olde'
)
)
*/
//Obtengamos los pedidos que tiene como mínimo 4 elementos y
contienen ‘Ye Olde’
$o = $this->Pedido->findAll($this->postConditions(
$this->data,
array('>=', 'LIKE')
));
La clave al especificar operadores es el orden de las columnas en el array $this-
>data. Dado que num_items está de primero, el operador >= es el que se le aplica.
El tercer parámetro te permite decirle a CakePHP qué operador booleano SQL
usar entre condiciones de búsqueda. Una cadena de carateres como ‘AND’, ‘OR’ y ‘XOR’
son valores válidos.
Finalmente, si el último parámetro se establece a true, y el
parámetro $operadores es un array, los campos no incluidos en $operadores no se incluirán
en las condiciones devueltas.
paginate
Este método es usado para paginar resultados cargados por tus modelos. Puedes
especificar tamaño de páginas, condiciones de búsqueda del modelo y más. Mira la
sección paginación para más detalles sobre cómo usar paginate .
requestAction
requestAction(string $url, array $opciones)
Esta función llama a una acción de un controlador de cualquier lugar y devuelve los
datos de la acción. La dirección $url pasada es una URL relativa de CakePHP
(/nombrecontrolador/nombreaccion/parametros). Para pasar datos extras a la acción del
controladores receptor, añádelos al array $options.
Puedes usar requestAction() para obtener una vista completamente renderizada
pasando 'return' en las opciones:requestAction($url, array('return'));
Si se utiliza sin caché, requestAction puede llevar a un pobre rendimiento. Es
ráramente apropiado usarlo en un controlador o modelo.
Es mejor usar requestAction junto con elementos en caché, como una manera de
obtener datos para un elemento antes de renderizar. Usemos el ejemplo de poner un
elemento “últimos comentarios” en el diseño (layout). Primero necesitamos crear una
función en un controlador que devolverá los datos.
// controllers/comments_controller.php
class CommentsController extends AppController {
function latest() {
return $this->Comment->find('all',
array(
'order' =>
'Comment.created DESC',
'limit' => 10)
);
}
}
Si ahora creamos un elemento simple para llamar a esa función:
// views/elements/latest_comments.ctp

$comments = $this->requestAction('/comments/latest');
foreach($comments as $comment) {
echo $comment['Comment']['title'];
}
Podemos colocar esos elementos en cualquier sitio para obtener la salida usando:
echo $this->element('latest_comments');
Escrito de esta manera, siempre que el elemento sea renderizado, se realizará una
petición al controlador para obtener los datos, los datos serán procesados y devueltos. De
todos modos, de acuerdo con el aviso anterior, es mejor utilizar caché de elementos para
prevenir procesamiento innecesario. Modificando la llamada a element para que se vea así:
echo $this->element('latest_comments', array('cache'=>'+1
hour'));
La llamada a requestAction no se realizará mientras que la el archivo de la vista
del elemento en cache exista y sea válido.
Además, requestAction ahora toma urls con estilo cake basadas en arrays:
echo $this->requestAction(
array(
'controller' => 'articles',
'action' => 'featured'
),
array('return')
);
Esto permite a la llamada a requestAction evitar el uso de Router::url lo que
puede incrementar el rendimiento. Las urls basadas en arrays son las mismas que las
que HtmlHelper:link usa, con una diferencia. Si estás usando parámetros con nombre en
tu url, entonces el array de url debe envolver los parámetros con nombre en la clave
‘named’. Esto es porque requestAction sólo combina los argumentos nombrados del array
en el array de miembros deController::params y no coloca los argumentos con nombre en
la clave ‘named’.
echo $this->requestAction('/articles/featured/limit:3');
Este, como array en requestAction debería ser:
echo $this->requestAction(
array(
'controller' => 'articles',
'action' => 'featured',
'named' => array(
'limit' => 3
)
)
);
A diferencia de otros lugares donde las urls de arrays son análogas a urls de
cadenas, requestAction las trata de manera diferente.
Cuando utilices una url de array junto con requestAction() has de
especificar todos los parámetros que necesitarás en la acción pedida. Esto incluye
parámetros como $this->data y $this->params['form']
loadModel
loadModel(string $modelClass, mixed $id)
La función loadModel es útil cuando se necesita usar un modelo que no es
propiamente el modelo por defecto del controlador o uno de sus modelos asociados.
$this->loadModel('Article');
$recentArticles = $this->Article->find('all', array('limit' =>
5, 'order' => 'Article.created DESC'));
$this->loadModel('User', 2);
$user = $this->User->read();

4. Conclusiones

Dado los datos obtenido podemos concluir que tanto ORM y Entity Framework son
muy útiles dado las facilidades que tienen cada uno para el desarrollo, aunque hay que tomar
en cuenta los beneficios que nos da y también sus perjuicios dado que de eso depende la
programación a desarrollar.

5. Recomendaciones

Las recomendaciones a tomar serian introducirse más en los temas de consulta para
facilitar los desarrollos de aplicaciones, ya que sería un beneficio tanto para nosotros como
desarrolladores como para la comunidad a la que vayamos a brindar el servicio.
Contenido
1. Introducción ............................................................................................................... 2

2. Objetivos .................................................................................................................... 2

3. Framework CAKEPHP .............................................................................................. 2

¿Qué es CAKEPHP Framework y porqué hay que utilizarlo? ...................................... 2

¿Cómo se utiliza? ........................................................................................................... 3

Beneficios ...................................................................................................................... 5

¿Qué se necesita? ........................................................................................................... 6

Requerimientos .............................................................................................................. 6

Preparándose para Instalar ............................................................................................. 6

Permisos ......................................................................................................................... 7

Instalación ...................................................................................................................... 7

Desarrollo ...................................................................................................................... 8

Producción ..................................................................................................................... 8

Instalación Avanzada ..................................................................................................... 9

Rutas de Clase Adicionales ......................................................................................... 10

Apache y mod_rewrite (y .htaccess) ............................................................................ 11

Lighttpd y mod_magnet ............................................................................................... 14

Pretty URLs en nginx .................................................................................................. 16

URL Rewrites on IIS7 (Windows hosts) ..................................................................... 17

Enciéndelo ................................................................................................................... 19

Configuración de Base de Datos.................................................................................. 19

Configuración del Core................................................................................................ 21

La Clase de Configuración .......................................................................................... 21

Métodos de la Clase Configure.................................................................................... 22


Variables de Configuración Principales de CakePHP ................................................. 23

Constantes de Configuración ....................................................................................... 25

La Clase App ............................................................................................................... 25

Importando librerías del Core ...................................................................................... 26

Importando Controladores, Modelos, Ayudantes, Comportamientos y Componentes26

Cargando desde Plugins ............................................................................................... 27

Cargando Archivos de Terceros .................................................................................. 27

Configuración de Rutas ............................................................................................... 28

Enrutamiento por Defecto............................................................................................ 28

Parámetros con Nombre .............................................................................................. 28

Definir Rutas ................................................................................................................ 29

Pasando parámetros a la acción ................................................................................... 32

Rutas con prefijos ........................................................................................................ 33

Enrutamiento por defecto ............................................................................................ 34

Passed arguments ......................................................................................................... 34

Parámetros con nombre ............................................................................................... 36

Pasando parámetros a las acciones .............................................................................. 37

Prefix Routing.............................................................................................................. 38

Rutas y plugins ............................................................................................................ 39

Extensiones de archivo ................................................................................................ 39

Inflexiones Propias ...................................................................................................... 40

Haciendo Bootstrap de CakePHP ................................................................................ 41

Controladores ............................................................................................................... 41

The App Controller ...................................................................................................... 43

The Pages Controller ................................................................................................... 43


Atributos del Controlador ............................................................................................ 44

Atributos Relacionados con la Página: “$layout” y “$pageTitle” ............................... 45

El Atributo de Parámetros (“$params”) ....................................................................... 47

Otros Atributos ............................................................................................................ 49

persistModel ................................................................................................................ 49

Métodos del Controlador ............................................................................................. 50

Interactuando con Vistas.............................................................................................. 50

Control de Flujo ........................................................................................................... 52

Retrollamadas (“Callbacks”) ....................................................................................... 53

Otros Métodos Útiles ................................................................................................... 54

4. Conclusiones ............................................................................................................ 59

5. Recomendaciones .................................................................................................... 59

6. Figuras...................................................................................................................... 62

7. Bibliografía .............................................................................................................. 62

6. Figuras
Figura 1 MVC .................................................................................................................... 4

7. Bibliografía
https://book.cakephp.org/. (s.f.). Obtenido de https://book.cakephp.org/:
https://book.cakephp.org/1.3/es/The-Manual/Beginning-With-CakePHP/What-is-
CakePHP-Why-Use-it.html
https://book.cakephp.org/. (s.f.). Obtenido de https://book.cakephp.org/:
https://book.cakephp.org/1.3/es/The-Manual/Beginning-With-CakePHP/Understanding-
Model-View-Controller.html

También podría gustarte