Está en la página 1de 92

Introduccin a CakePHP

Qu es CakePHP?
CakePHP es un framework (entorno de trabajo) libre y de cdigo abierto para el
desarrollo en PHP. Es una estructura de libreras clases y una infraestructura run!time
(en tiempo de ejecucion) para programadores de aplicaciones web originalmente
inspirado en el framework "uby #n "ails. $uestra principal meta es permitir su trabajo
de manera estructurada y r%pida sin perdida de fle&ibilidad
Por qu CakePHP?
CakePHP tiene 'arias caractersticas (ue lo )acen una gran opcin como un framework
para desarrollo de aplicaciones r%pidas y con el menor costo de molestia. *(u )ay unas
pocas en ningun orden en particular.
Comunidad acti'a y amigable
+icencia fle&ible
Compatibilidad con PHP, y PHP-
C"./ integrado para la interaccin con la base de datos y las preguntas
simplificadas
0caffolding
*r(uitectura 1odelo 2ista Controlador (12C)
/espac)ador de peticiones con buena 'ista ."+ personali3adas
2alidacin incorporada
Plantillas r%pidas y fle&ibles (0int%&is PHP con Helpers)
Helpers en 2istas para *4*5 4a'ascript 6ormularios H71+ y m%s
0eguridad 0esiones y Componentes para 1anejo de Peticiones
+ista de Control y *cceso fle&ible
/esinfeccin de datos
Cac)8 fle&ible en 2istas
7rabaja desde cual(uier subdirectorio web del sitio con poca o ninguna
configuracin de *pac)e en'uelta
Historia de CakePHP
En 9::- 1ic)al 7atarynowic3 escribio una minima 'ersion de un 6ramework "%pido
para *plicaciones en PHP. El encontr (ue ese fue el principio de un muy buen
framework. 1ic)al public el framework bajo la licencia 1;7 me3clando Cake y
abriendose a una comunidad de desarrolladores (uienes a)ora mantienen Cake bajo el
nombre CakePHP
Conceptos Bsicos
Introduccin
Este capitulo es una bre'e introduccin al concepto MVC el cual a) sido implementado
en Cake. 0i eres nue'o en el MVC (1odelo 2ista Controlador) este capitulo
definiti'amente es para ti. 2amos a iniciar con una discusin general de los conceptos
MVC trabajando a nuestra manera el MVC en Cakephp y mostrar algunos ejemplos
simples de Cakephp usando el patrn de MVC.
El Patrn MVC
1odelo!2ista!Controlador es un patrn para dise<o de software (ue ayuda a separar
lgicamente el cdigo )aci8ndolo reusable mantenible y generalmente mejor. 1odelo
2ista Controlador fue descrito por primera 'e3 por el autor de =t)e group >ang of
6our? /ean Helman escribo@
"El paradigma MVC es un camino para fragmentar la aplicacin, o
tan solo una parte de la interfaz, en tres partes:
el modelo, la vista y el controlador. Originalmente MVC fue
desarrollado para trazar la relacin tradicional de la entrada,
procesamiento y salida en el mito de la !"# $#nterfaz grfica de
usuario%.
Entrada &' (rocesamiento &' )alida
Controller &' Model &' Vie*
+a entrada del usuario, el modelado del mundo e,terno, y la
retroalimentacin visual para el usuario son separados y dirigidos por
los o-etos modelo, vista y controlador.
El controlador interpreta las entradas del mouse y teclado desde
el usuario, y convierte sus acciones en comandos .ue son enviados
/acia el modelo y0o la vista para efectuar el camio apropiado.
El modelo mane-a uno o ms elementos de datos, responde a las
consultas acerca de su estado, y responde a las instrucciones para
camiar de estado. +a vista mane-a un rea rectangular del rea .ue se
ve y es responsale de presentar los datos al usuario con una
cominacin de grficos y te,to."
En terminos de Cake El modelo (Model) representa una base de datos tabla
registro as como sus relaciones con otras tablas registros. +os 1odelos (Models)
contienen las reglas para las 'alidacin de datos. Estas reglas son aplicadas cuando en el
modelo (model) se insertan o actuali3an datos. +as 'istas en cake estan representadas
por los arc)i'os view los cuales son arc)i'os de H71+ con cdigo PHP incluido.
+os controladores (controllers) de Cake manejan las peticiones del ser'idor. 7oma
las entradas del usuario (."+ y datos de P#07) aplica la logica de negocios utili3ar
los modelos (models) para leer y escribir en nase de datos y otras rutas y manda la
salida apropiada de datos con los arc)i'os de 'istas (view).
Para )acer tan f%cil como sea posible la organi3acin de tu aplicacin Cake usa este
patron no solo para manejar como interactAan los objetos dentro de la aplicacion si no
tambi8n como son almacenados los arc)i'o lo cual se detalla a continuacin.
escripcin de la disposicin de archi!os de Cake
Cuando desempa(uete Cake en su ser'idor encontrar% B carpetas principales.
app
ca1e
vendors
+a carpeta cake es el lugar para las bibliotecas base de Cake y generalmente no
necesitar% tocarlo.
+a carpeta app es el lugar donde estar%n las carpetas y arc)i'os especficos de su
aplicacin. +a separacin entre la carpeta cake y la carpeta app )ace posible para usted
tener muc)as carpetas app compartiendo un solo conjunto de bibliotecas de Cake. Esto
tambi8n facilita actuali3ar CakePHP@ usted solo descargue la Altima 'ersin de Cake y
sobre!escriba sus bibliotecas base actuales. $o necesita preocuparse por sobre!escribir
algo (ue )aya escrito para su aplicacin.
Puede utili3ar la carpeta !endors para guardar en ella bibliotecas de terceros. *prender%
m%s acerca de esto m%s adelante pero la idea b%sica es (ue se puede acceder a clases
(ue )a colocado en la carpeta 'endors utili3ando la funcin !endor"#.
#bser'e la disposicin de arc)i'os completa@
0app
0config & Contiene arc/ivos de configuracin de la ase
de datos, 2C+, etc.
0controllers & +os controladores van a.u3
0components & +os componentes van a.u3
0inde,.p/p & +e permite desplegar ca1e con 0app como
4ocument5oot
0models & +os modelos van a.u3

0plugins & +os (lugins van a.u3
0tmp & "sado para cac/e y logs
0vendors & Contiene las iliotecas de terceros para esta
aplicacin
0vie*s & +as vistas van a.u3
0elements & +os elementos $pe.ue6as partes de vistas% van
a.u3
0errors & )us errores personalizados van a.u3
0/elpers & +os /elpers van a.u3
0layouts & +os layout de la aplicacin van a.u3
0pages & +as vistas estticas van a.u3.
0*eroot & El documentroot de su aplicacin
0css
0files
0img
0-s
0ca1e & 7iliotecas ase de Ca1e. 8o edite ning9n
arc/ivo a.u3.
inde,.p/p
0vendors & "tilizado para las iliotecas de terceros para
todo el servidor.
VE5)#O8.t,t & 2.u3 se ve la versin .ue se esta utilizando.
Instalando CakePHP
$eccin %
Introduccin
*)ora (ue conoce todo lo (ue tiene (ue saber de la estructura y propositode todas las
librerias CakePHP o se a saltado a esta parte por (ue no le preocupan esas cosas y solo
(uiere comen3ar a jugar. /e cual(uier forma est% listo para ensuciar sus manos. Este
capitulo describir% como debe ser instalado en el ser'idor diferentes formas de
configurar su ser'idor descargando e instalando CakePHP trayendole la pagina por
defecto de CakePHP y algunos datillos de locali3aciones y resoluciones de problemas
solo en caso de (ue todo no 'aya como est% planeado.
$eccin&
Requerimientos
Para usar CakePHP usted debe primero tener un ser'idor (ue tenga las librerias y
programas para correr CakePHP.
Requerimientos del Servidor
Estos son los re(uerimientos para la puesta en marc)a del ser'idor para corre CakePHP@
C. .n ser'idor H77P (como *pac)e) con lo siguiente )abilitado@ sesiones
modDrewrite (no absolutamente necesario pero preferido).
9. PHP ,.B.9 o superior. 0 CakePHP trabaja bien en PHP , o -.
B. .n motor de base de datos (a)ora )ay soporte para 1y0E+ Postgre0E+ y un
en'oltorio para */#/F)
$eccin '
Instalando CakePHP
()teniendo la !ersin esta)le *s reciente
Hay diferentes opciones al obtener una copia de CakePHP@ #btener una 'ersin estable
desde Cake6orge ad(uirir un pa(uete (ue se crea cada noc)e u obtener el cdigo en su
actuali3acin m%s reciente desde 02$.
Para descargar el cdigo de la 'ersin estable re'ise la seccin de arc)i'os de del
proyecto CakePHP en Cake6orge entrando a la siguiente direccin@
)ttp@GGcakeforge.orgGprojectsGcakep)pG.
Para ad(uirir la 'ersin (ue se crea cada noc)e descargela desde
)ttp@GGcakep)p.orgGdownloadsGinde&Gnig)tly. Esta 'ersin (ue se crea cada noc)e es
estable y en ocaciones incluye las correcciones a errores del cdigo entre 'ersiones
estables.
Para obtener la actuali3acin m%s reciente desde el repositorio 02$ utilice su cliente
02$ fa'orito y conecte a )ttps@GGs'n.cakep)p.orgGrepoGtrunkGcakeG y despu8s seleccione
su 'ersin.
ese*paquetando
*)ora (ue a descargado la 'ersin m%s reciente colo(ue el pa(uete comprimido dentro
del webroot de su ser'idor web y desempa(uetelo a). Hay dos opciones para )acer
esto@ utili3ar una configuracin de instalacin para desarrollo (ue le permite 'er
f%cilmente muc)as aplicaciones CakePHP bajo un mismo dominio o utili3ar la
configuracin de instalacin para produccin la cual permite una sola aplicacin
CakePHP en el dominio.
$eccin +
Configuracin de la instalacin de CakePHP
+a primer opcin para configurar la instalacin de CakePHP es recomendada
Anicamente para un ambiente de desarrollo debido a (ue es menos segura. +a segunda
opcin es considerada m%s segura y puede ser utili3ada en un ambiente de produccin.
$#7*@ +a carpeta GappGtmp debe tener permisos de escritura para el usuario con el (ue
se ejecuta el ser'idor web.
Configuracin de una instalacin para desarrollo
Para desarrollar podemos colocar la carpeta de instalacin de Cake completa dentro del
/ocument"oot especificado de una manera como esta@
0***root
0ca1e
0app
0ca1e
0vendors
./taccess
inde,.p/p
En esta configuracin de instalacin la carpeta wwwroot actAa como la ra3 del ser'idor
web por ello sus ."+s aparecer%n de una manera como esta (si tambi8n se est%
utili3ando modDrewrite)@
***.e,ample.com0ca1e0controller8ame0action8ame0param:0param;
Con,i-uracin de una instalacin para produccin
Para utili3ar una configuracin de instalacin para produccin usted necesita tener
derec)os para cambiar el /ocument"oot en su ser'idor. Haciendo esto todo el dominio
actAa como una sola aplicacin CakePHP
+a configuracin de una instalacin para produccin utili3a la siguiente distribucin de
arc)i'os@
..ruta<a<instalacin<de<ca1e
0app
0config
0controllers
0models
0plugins
0tmp
0vendors
0vie*s
0*eroot =&& Este dee ser su nuevo 4ocument5oot
./taccess
inde,.p/p
0ca1e
0vendors
./taccess
inde,.p/p
Con,i-uracin de httpd.con, su-erida para produccin
4ocument5oot 0pat/<to<ca1e0app0*eroot
En esta configuracin el directorio webroot esta actuando como la rai3 web por ello sus
."+s se pueden 'er de una manera similar a esta (si esta utili3ando modDrewrite)@
/ttp:00***.e,ample.com0controller8ame0action8ame0param:0param;
Con,i-uracin /!an0ada1 (pciones alternati!as de instalacin
Hay algunos casos en los (ue usted podra (uerer colocar los directorios de Cake en
diferentes lugares del disco. Por ejemplo podra necesitarlo debido a alguna restriccin
en su ser'idor o tal 'e3 solo (uiera (ue algunas de sus aplicaciones compartan las
mismas bibliotecas de Cake.
Estas son tres partes principales en una aplicacin Cake@
+as bibliotecas b%sicas de CakePHP ! 0e encuentran en Gcake
El cdigo de su aplicacin (por ejemplo controllers models layouts y 'iews) !
0e encuentran en Gapp
+os arc)i'os webroot de su aplicacin (por ejemplo im%genes ja'ascript y css) !
0e encuentran en GappGwebroot
Cada uno de estos directorios se puede locali3ar en cual(uier lugar de nuestro sistema
de arc)i'os e&cepto webroot (ue necesita ser accesible por su ser'idor web. .sted
tambi8n puede mo'er el directorio webroot fuera del directorio app siempre (ue le diga
a Cake donde lo )a puesto.
Para configurar su instalacin de Cake usted necesitar% reali3ar algunos cambios en
GappGwebrootGinde&.p)p (al (ue es distribuido en Cake). Hay tres constantes (ue usted
necesitar% editar@ "##7 *PPD/;" and C*HEDC#"ED;$C+./EDP*7H.
"##7 debe ser configurado con la ruta de la carpeta (ue contenga la carpeta
app.
*PPD/;" debe ser configurado con la ruta de su directorio app.
C*HEDC#"ED;$C+./EDP*7H debe ser configurado con la ruta de la carpeta
(ue contiene sus bibliotecas de Cake.
2app23e)root2inde4.php "al-unos co*entarios ,ueron re*o!idos#
if $>defined$?5OO@?%%
A
define$?5OO@?, dirname$dirname$dirname$<<B#+E<<%%%%C
D
if $>defined$?2((<4#5?%%
A
define $?2((<4#5?, asename$dirname$dirname$<<B#+E<<%%%%C
D
if $>defined$?C2EE<CO5E<#8C+"4E<(2@F?%%
A
define$?C2EE<CO5E<#8C+"4E<(2@F?, 5OO@%C
D
.n ejemplo le puede ayudar a entender esto mejor. ;magine (ue (uiero configurar Cake
para trabajar con la siguiente configuracin@
Euiero compartir las bibliotecas de Cake con otras aplicaciones y colocarlas en
GusrGlibGcake.
1i directorio webroot necesita estar en G'arGwwwGmysiteG.
+os arc)i'os de mi aplicacin ser%n almacenados en G)omeGmeGmysite.
+a configuracin de arc/ivos seria como esta:
0/ome
0me
0mysite =&& "tilizado para ser
0ca1e<install0app
0config
0controllers
0models
0plugins
0tmp
0vendors
0vie*s
inde,.p/p
0var
0***
0mysite =&& "tilizado para ser
0ca1e<install0app0*eroot
0css
0files
0img
0-s
./taccess
css.p/p
favicon.ico
inde,.p/p
0usr
0li
0ca1e =&& "tilizado para ser
0ca1e<install0ca1e
0ca1e
0config
0docs
0lis
0scripts
app<controller.p/p
app<model.p/p
asics.p/p
ootstrap.p/p
dispatc/er.p/p
0vendors
7eniendo este tipo de configuracin necesitara editar mi arc)i'o inde&.p)p en el
webroot ( (ue en este ejemplo sera G'arGwwwGmysiteGinde&.p)p) para (ue (uedara
como el siguiente@
Es recomendable utili3ar la constante I/0I en lugar de diagonales como separador para
las rutas de arc)i'os. Esto pre'iene cual(uier error de Iarc)i'os faltantesI (ue usted
pudiera obtener como resultado de utili3ar los separadores e(ui'ocados y esto )ace su
cdigo m%s JportableJ.
if $>defined$?5OO@?%%
A
define$?5OO@?, 4).?/ome?.4).?me?%C
D
if $>defined$?2((<4#5?%%
A
define $?2((<4#5?, ?mysite?%C
D
if $>defined$?C2EE<CO5E<#8C+"4E<(2@F?%%
A
define$?C2EE<CO5E<#8C+"4E<(2@F?, 4).?usr?.4).?li?.4).?ca1e?%C
D
$eccin 5
Configuracin de Apache y mod_rerite
1ientras CakePHP fue desarrollado para utili3ar modDrewrite desde un inicio nos
)emos dado cuenta (ue a unos cuantos usuarios se les complica dejar todo funcionando
correctamente en sus sistemas. *(u tenemos unas cuantas cosas (ue tal 'e3 debera de
intentar para dejarlo funcionando correctamente@
*segArese (ue la sobreescritura de .)taccess est% permitida@ en su )ttpd.conf
usted debe de tener una seccin (ue define otra seccin por cada carpeta en su
sistema. *segArese de (ue la carpeta correcta tiene asignado /llo3(!erride en
/ll .
*segArese de (ue est% editando )ttpd.conf del sistema en lugar de algAn arc)i'o
)ttpd.conf del usuario o sitio en especfico
Por una ra3n u otra pudo )aber obtenido una copia de CakePHP sin los
arc)i'os necesitados .)taccess. Esto ocurre algunas 'eces debido a (ue algunos
sistemas operati'os tratan a los arc)i'os (ue inician con I.I como ocultos y no
los copian. *segArese de (ue su copa de CakePHP la )a ad(uirido de la seccin
de descargas del sitio o de nuestro repositorio 02$.
K*segArese de (ue se est% cargando modDrewrite correctamenteL. /ebera de 'er
algo como 6oadModule re3rite7*odule li)e4ec2httpd2*od7re3rite.so y
/ddModule *od7re3rite.c en su )ttpd.conf.
0i est% instalando Cake dentro de una carpeta de usuario
()ttp@GGejemplo.comGMmiusuarioG) necesitar% modificar el arc)i'o .)taccess en su
carpeta base de su instalacin de Cake. 0olo agregue la linea ? "ewrite
GMmiusuarioG ?.
0i por alguna ra3n sus ."+0 contienen una molesta y muy larga ;/ de sesin
()ttp@GGejemplo.comGpostsGNC*HEPHPO,kgj-PPsgab'nm)jgkdiuyCQ-RifRska)
debera tambi8n agregar =p)pDflag session.transDid off? al arc)i'o .)taccess en
la ra3 de su instalacin.
$eccin 8
Asegurarse de que funciona
1uy bien 'eamos este beb8 en accin. /pendiendo (ue tipo de instalacin utili3
debera de apuntar su na'egador a )ttp@GGwww.ejemplo.com
)ttp@GGwww.ejemplo.comGcake. En este punto se le presentar% el inicio por defecto de
CakePHP y un mensaje (ue le dice el estado actual de su cone&in con la base de datos.
K6elicidadesL .sted est% listo para crear su primera aplicacin basada en Cake.
Con,i-uracin
$eccin %
Configuracin de !ase de datos
7u arc)i'o app2con,i-2data)ase.php es dnde se configura la base de datos. .na
instalacin desde cero no tiene el arc)i'o database.p)p por lo (ue tendr%s )acer una
copia del arc)i'o database.p)p.default. .na 'e3 )ec)a la copia y renombrado el arc)i'o
tenemos@
00 app0config0dataase.p/p
var Gdefault H array$?driver? H' ?mys.l?,
?connect? H' ?mys.l<connect?,
?/ost? H' ?local/ost?,
?login? H' ?user?,
?pass*ord? H' ?pass*ord?,
?dataase? H' ?pro-ect<name?,
?prefi,? H' ??%C
"eempla3a la informacin (ue 'iene por defecto con la informacin de cone&in para tu
aplicacin.
.na nota acerca de la lla'e prefi&@ el string (ue ingreses ac% ser% agregado en todas las
llamadas 0E+ (ue genera Cake al interactuar con las tablas de tu base de datos. +o
puedes definir ac% una Anica 'e3 para (ue no tengas (ue especificarlo en otras partes.
7ambi8n te permite seguir las con'enciones de Cake en cuanto al nombramiento de
tablas si por ejemplo estas en un web)ost (ue slo te otorga una Anica base de datos.
$ota@ para las tablas join H*F71 agregas el prefi& slo una 'e3@
prefi&DapplesDbananas no prefi&DapplesDprefi&Dbananas.
CakePHP soporta los siguientes dri'ers de base de datos@
mys(l
postgres
s(lite
pear!dri'ername (por ejemplo pear!mys(l)
adodb!dri'ername
+a lla'e IconnectI en la cone&in Sdefault te permite especificar si la cone&in ser%
considerada persistente o no. "e'isa los comentarios en el arc)i'o database.p)p.default
para obtener ayudar acerca de cmo especificar tipos de cone&in para tu base de datos.
+as tablas de tu base de datos deberan seguir las siguientes con'enciones@
$ombres de tablas usadas por Cake deberan consistir en palabras en ;ngl8s en
plural como =users? =aut)ors? o =articles?. $otar (ue los correspondientes
molodes tienen nombres en singular.singular names.
7us tablas deben tener una lla'e primaria llamada IidI.
0i 'as a relacionar tablas usa lla'es for%neas como estas@ IarticleDidI. El nombre
de la tabla en singular seguido por un underscore seguido por IidI.
0i incluyes una columna llamada IcreatedI yGo ImodifiedI en tu tabla Cake
autom%ticamente poblar% el campo.
Podr%s notar (ue tambi8n se incluye una cone&in Stest en el arc)i'o database.p)p. *l
llenar esta configuracin (o agregar otras con formato similar) la podr%s usar en tu
aplicacin de la siguiente manera @
var Guse4Config H ?test?C
/entro de uno de tus modelos. /e esta menera puedes usar cual(uier cantidad de
cone&ines adicionales.
Modelos
$eccin %
"#u$ es un %odelo&
TEue es lo (ue )aceN Esto separa el domino lgico de la presentacin aislando la
lgica.
.n 1odelo es generalmente un punto de acceso a la base de datos m%s especficamente
a una tabla en concreto de la base de datos. Por defecto cada modelo usa la tabla cuyo
nombre es el plural de dic)o modelo. Ej. el modelo I.serI usa la tabla IusersI. +os
1odelos tambi8n pueden contener reglas de 'alidacin de datos informacin sobre
asociaciones y m8todos especficos para la tabla (ue usan. /e esta manera es como se
'e un modelo simple de .suario (.ser) en Cake@ Ejemplo 1odelo .suario (.ser
1odel) guardado en GappGmodelsGuser.p)p
=Ip/p
00 2ppModel te da toda la funcionalidad de un Modelo en Ca1e
class "ser e,tends 2ppModel
A
00 )iempre es uena prctica incluir esta variale
var Gname H ?"ser?C
00 Esto es usado para validar datos, ver Capitulo "Validacin de
4atos" $4ata Validation%.
var Gvalidate H array$%C
00 @amiJn puedes definir asociaciones
00 Mira la seccin K.L para ms informacin.
var G/asMany H array$?#mage? H'
array$?class8ame? H' ?#mage?%
%C
00 @amiJn puedes incluir tus propias funciones:
function ma1e#nactive$Guid%
A
00 Coloca tu lgica a.u3
D
D
I'
$ection &
'unciones del %odelo
/esde un punto de 'ista de PHP los modelos son clases (ue e&tienden la clase
*pp1odel. +a clase *pp1odel es originalmente definida en el directorio cakeG pero
usted puede (uerer crear la suya propia ponga esta en appGappDmodel.p)p. Usta debe
contener ciertos m8todos (ue son compartidos entre 9 o m%s modelos. +a clase
*pp1odel a su 'e3 e&tiende la clase 1odel (ue es una librera est%ndar de Cake y es
definida en cakeGlibsGmodel.p)p.
1ientras esta seccin trata mayoritariamente las funciones mas comunes de un 1odelo
en Cake es importante recordar usar el manual de referencia de Cake
()ttp@GGapi.cakep)p.org) por una completa informacin. 6unciones definidas por el
usuario.
.n ejemplo de un m8todo de tabla especfico en un 1odelo es un par de m8todos para
esconder y mostrar ()ide un)ide) entradas (posts) en un blog.
E9e*plo de :unciones en un Modelo
=Ip/p
class (ost e,tends 2ppModel
A
var Gname H ?(ost?C
function /ide $GidHnull%
A
if $Gid%
A
Gt/is&'id H GidC
Gt/is&'saveBield$?/idden?, ?:?%C
D
D
function un/ide $GidHnull%
A
if $Gid%
A
Gt/is&'id H GidC
Gt/is&'saveBield$?/idden?, ?M?%C
D
D
D
I'
;ecuperando tus atos
/ebajo 'emos algunas de las maneras est%ndar de obtener tus datos usando un 1odelo@
find*ll
o string Sconditions
o array Sfields
o string Sorder
o int Slimit
o int Spage
o int Srecursi'e
Esta funcin regresa los campos especficos en cantidad de registros )asta Slimit (ue
cumplan las condiciones especificadas en Sconditions (si las )ay) empie3a listando
desde la p%gina Spage (por defecto p%gina C) Sconditions debe 'erse como una
sentencia 0E+@ Sconditions O =race O IwookieI *$/ t)ermalDdetonators V B? como
ejemplo.
Cuando la opcin Srecursi'e es establecida con un 'alor mayor a C la funcin find*ll()
debe )acer un esfuer3o por regresar los modelos asociados a los registros recuperados
por find*ll(). 0i tu IPropiedadI tiene muc)os I/ue<osI (uienes a su 'e3 tienen muc)os
IContratosI find*ll() en tu 1odelo Propiedad debe regresar esos modelos asociados.
find
o string Sconditions
o array Sfields
o string Sorder
o int Srecursi'e
/e'uel'e los (o todos si no es especificado) campos especificados desde el primer
record (ue cumpla las condiciones de Sconditions.
Cuando a la opcin Srecursi'e se le asigna un 'alor entero entre C y B la funcin find()
debe )acer un esfuer3o por regresar los modelos asociados a a(uellos registros
encontrados por find(). +a recursin find puede subir )asta B ni'eles de profundidad. 0i
tu IPropiedadI tiene muc)os I/ue<osI (uienes a su 'e3 tienen muc)os IContratosI una
recursin find() en tu modelo IPropiedadI deber% regresar )asta tres ni'eles de
profundidad de modelos asociados.
find*llFyWfield$ameV
string S'alue
Estas funciones m%gicas pueden ser usadas como un acceso directo a buscar tus tablas
para una fila dada en un cierto campo y un cierto 'alor. 0olo adjunta el nombre del
campo (ue (uieres buscar y escrbelo como ICamelCaseI. Ejemplos (usados en un
controlador (Controller)) pueden ser@
St)isXPostXfindFy7itle(I1y 6irst Flog PostI)Y
St)isX*ut)orXfindFy+ast$ame(I"ogersI)Y St)isXPropertyXfind*llFy0tate(I*ZI)Y
St)isX0pecimenXfind*llFyHingdom(I*nimaliaI)Y
El resultado retogresado es un array formateado como de'uel'e find() o find*ll().
find$eig)bours
string Sconditions
array Sfield
string S'alue
/e'uel'e un array con los modelos 'ecinos (solo con los campos especificados)
especificados por Sfield y S'alue filtrados por las condiciones 0E+ impuestas en
Sconditions.
Esto es Atil en situaciones donde (uieres tener links I*nteriorI y I0iguienteI para (ue los
usuarios na'eguen alguna secuencia ordenada a tra'8s de tus entradas en el modelo.
Esto solo funciona para campos num8ricos y del tipo fec)a y )ora.
class #magesController e,tends 2ppController
A
function vie*$Gid%
A
00 4ecimos .ue .ueremos mostrar una imagen
Gt/is&'set$?image?, Gt/is&'#mage&'find$"id H Gid"%C
00 (ero tamiJn .ueremos la imagen anterior y siguiente
Gt/is&'set$?neig/ours?, Gt/is&'#mage&'find8eig/ours$null,
?id?, Gid%C
D
D
Esto nos da un completo Simage[I;mageI\ array a lo largo con
Sneig)bours[Ipre'I\[I;mageI\[IidI\ y Sneig)bours[Ine&tI\[I;mageI\[IidI\ en nuestra 'ista.
field
string Sname
string Sconditions
string Sorder
/e'uel'e como cadena de te&to (string) un Anico campo del primer registro (ue cumpla
Sconditions como condiciones ordenado por Sorder.
findCount
string Sconditions
/e'uel'e el nAmero de registros (ue cumplen las condiciones dadas.
generate+ist
string Sconditions
string Sorder
int Slimit
string SkeyPat)
string S'aluePat)
Esta funcin es un atajo para obtener una lista de pares de 'alores lla'e ! especialmente
para crear un tag select de )tml desde una lista de tus modelos. .sa Sconditions Sorder
y Slimit como par%metros de igual manera (ue una solicitud find*ll(). En los
parametros SkeyPat) y S'aluePat) es donde le dices a tu modelo donde debe encontrar
las lla'es y 'alores para tu lista generada. Por ejemplo si tu (uieres generar una lista de
roles basados en tu modelo "ol (ue abierto por ids con 'alores enteros la funcin
completa se in'oca como algo as@ St)isXset(
?5oles?,
Gt/is&'5ole&'generate+ist$null, ?role<name 2)C?, null,
?AnD.5ole.id?, ?AnD.5ole.role<name?%
)Y
00@/is *ould return somet/ing li1e:
array$
?:? H' ?2ccount Manager?,
?;? H' ?2ccount Vie*er?,
?L? H' ?)ystem Manager?,
?N? H' ?)ite Visitor?
%C
read
string Sfields
string Sid
.sa esta funcin para obtener los campos y sus 'alores desde un registro actualmente
recuperado o de un registro especificado por Sid.
Por fa'or nota (ue las operaciones read() solo afectar%n el primer ni'el de asociaciones
de los modelos tega el 'alor (ue tenga Srecursi'e en el modelo. Para ganar ni'eles
adicionales de acceso usa find() o find*ll().
(uery
string S(uery
e&ecute
string S(uery
+as llamadas 0E+ pueden ser )ec)as usando la funcin (uery() y e&ecute() desde un
modelo. +a diferencia entre estas dos funciones es (ue (uery() es usada para )acer
consultas personali3adas de 0E+ (el resultado (ue regresan) y e&ecute() es usada para
ejecutar comandos 0E+ personali3ados (ue no re(uieren 'alor de retorno.
6la*adas $Q6 Personali0adas con quer<"#
=Ip/p
class (ost e,tends 2ppModel
A
var Gname H ?(ost?C
function posterBirst8ame$%
A
Gret H Gt/is&'.uery$")E+EC@ first<name B5OM posters<tale
OFE5E poster<id H :"%C
Gfirst8ame H GretPMQP?first<name?QC
return Gfirst8ameC
D
D
I'
Condiciones Co*ple9as :ind "usando arra<s#
+a mayora de las llamadas de bAs(ueda en los modelos incluyen pasar condiciones de
una u otra manera. El acercamiento m%s simple a esto es usar la clausula ]HE"E de
0E+ pero si necesitas m%s control debes usar arrays. .sar arrays es una forma mas
clara y f%cil de leer y tambi8n de construir consultas. Esta sinta&is tambi8n separa los
elementos de tu consulta (campos 'alores operadores etc.) en discretas y manipulables
partes. Esto permite a Cake generar la consulta m%s eficiente posible asegurando una
sinta&is 0E+ apropiada y debidamente escapada (escapar caracteres) en cada parte de
la consulta.
En su forma m%s b%sica un consulta basada en arrays se 'e as@
E9e*plo de Condiciones Bsicas de B=squeda >sando /rra<s1
Sconditions O array(=Post.title? =7)is is a post?)Y
GGEjemplo de uso con un 1odelo@
Gt/is&'(ost&'find$Gconditions%C
+a estructura es se e&plica bastante por si misma@ eso debe encontrar cual(uier post
donde el ttulo concuerde con la cadena =7)is is a post?. $ote (ue podramos )aber
usado =title? como nombre de campo pero siempre es una buena pr%ctica cuando se
construyen consultas especificar el nombre del modelo al (ue pertenece clarificando la
lectura del cdigo y pre'iendo colisiones en un futuro. TEue )ay acerca de otros tipos
de coincidenciasN Estas son igualmente simples. /ejanos mostrarte como encontramos
todos los posts donde el ttulo no es =7)is is a post?@
array$"(ost.title" H' "=' @/is is a post"%
+o Anico (ue fue ad)erido es IWVI antes de la e&presin. Cake puede parsear cual(uier
operador de comparacin de 0E+ '%lido incluyendo e&presiones usando +;HE
FE7]EE$ o "E>E5 siempre y cuando tu dejes un espacio entre el operador y la
e&presin o el 'alor. .na e&cepcin a(u es ;$ (^). /igamos (ue (uieres encontrar
posts donde el ttulo es una serie de 'alores@
array$"(ost.title" H' array$"Birst post", ")econd post", "@/ird
post"%%
*gregar filtros adicionales a las condiciones es simple como agregar pares de
lla'esG'alores adicionales al array@
array
$
"(ost.title" H' array$"Birst post", ")econd post", "@/ird
post"%,
"(ost.created" H' "' " . date$?R&m&d?, strtotime$"&; *ee1s"%%
%
Por defecto Cake junta multiples condiciones con boleanos *$/Y lo (ue significa el
cdigo anterior solo encontrar% posts (ue )an sido creados en las 9 semanas pasadas y
tienen algAn ttulo de los dados. Como sea nosotros podemos encontrar f%cilmente
posts (ue concuerden con esta otra condicin@
array
$"or" H'
array
$
"(ost.title" H' array$"Birst post", ")econd post", "@/ird
post"%,
"(ost.created" H' "' " . date$?R&m&d?, strtotime$"&; *ee1s"%%
%
%
Cake acepta todos los operadores boleanos 0E+ '%lidos incluyendo *$/ #" $#7
5#" etc. y ellos pueden estar en mayAsculas o minAsculas como prefieras. Est%s
condiciones son infinitamente anidables. /igamos (ue tu tienes relaciones
)as1anyGbelongs7o entre Posts y *ut)ors lo (ue resultaria en un +E67 4#;$ el la
bAs(ueda terminada en Post. /igamos (ue (uieres encontrar todos los posts (ue
contienen una determinada palabra lla'e o fueron creados en las ultimas dos semanas
pero tu (uieres restringir tu bAs(ueda a los posts escritos por Fob@
array
$"2ut/or.name" H' "7o", "or" H' array
$
"(ost.title" H' "+#EE SmagicS",
"(ost.created" H' "' " . date$?R&m&d?, strtotime$"&; *ee1s"%
%
%
Controladores
$eccin %
"#u$ es un controlador&
.n controlador es usado para manejar la lgica de cierta seccin de tu aplicacin.
ComAnmente los controladores son usados para manejar la lgica de un slo modelo.
Por ejemplo si est%s construyendo un sitio (ue maneja una coleccin de 'ideos podras
tener un 2ideoController y un *rriendoController manejando los 'ideos y arriendos
respecti'amente. En Cake? los no*)res de los controladores estn sie*pre en
plural.
+os controladores de tu aplicacin son sub!clases de la clase *ppController de Cake
(ue a su 'e3 e&tiende la clase principal Controller. +os controladores pueden tener
cual(ueir cantidad de acciones@ funciones usadas en tu aplicacin web para mostrar
'istas.
+a clase *ppController puede ser definida en 2app2app7controller.php y debe contener
m8todos (ue son compartidos entre dos o m%s controladores. * su 'e3 *ppController es
una sub!clase de Controller (ue es una clase de la biblioteca est%ndar de Cake.
.na accin es una Anica funcionalidad de un controlador. Es ejecutada autom%ticamente
por el /ispatc)er si una solicitud de p%gina entrante la especifica en la configuracin de
rutas (routes). "etomando el ejemplo de la coleccin de 'ideos nuestro 2ideoController
podra tener las acciones vie*$% rent$% y searc/$%. El controlador debera estar
ubicado en GappGcontrollersG'ideosDcontroller.p)p y contener@
class VideosController e,tends 2ppController
A
function vie*$Gid%
A
00lgica de la accin...
D

function rent$Gcustomer<id, Gvideo<id%
A
00lgica de la accin...
D

function searc/$G.uery%
A
00lgica de la accin...
D
D
/eberas poder acceder a estas acciones usando las siguientes ."+s de ejemplo@
/ttp:00***.e,ample.com0videos0vie*0;TL
/ttp:00***.e,ample.com0videos0rent0T:;N0M&;LT;TL
/ttp:00***.e,ample.com0videos0searc/0/udsuc1erUpro,y
Pero cmo se 'eran las p%ginasN Podras necesitar definir una 'ista para cada una de
estas acciones ! re'isa como )acerlo en el pr&imo captulo pero@ las siguientes
secciones te mostrar%n como dominar el poder de un controlador Cake. Especficamente
'as a aprender como )acer (ue tu controlador le pase datos a la 'ista redireccionar al
usuario y muc)o m%s.
$eccin &
'unciones del Controlador
*un(ue esta seccin describir% las funciones m%s usadas en los controladores de Cake
es importante recordar usar )ttp@GGapi.cakep)p.org como una referencia completa.
Interactuando con tus Vistas
set
o string $variable
o mi&ed $valor
Esta funcin es la principal manera de lle'ar datos desde el controlador a la 'ista.
Puedes usarla para en'iar lo (ue sea@ 'ariables arreglos etc. .na 'e3 usada set$% la
'ariable puede ser usada en tu 'istaY ejecutando set(IcolorI IblueI) en tu controlador )ace
(ue Scolor este disponible en la 'ista.
!alidateErrors
"etorna la cantidad de errores generados por un save no e&itoso.
!alidate
2alida los datos del modelo de acuerdo a sus reglas de 'alidacin. Para m%s informacin
re'isar ?2alidacin de datos?.
render
o string $accion
o string $layout
o string $archivo
Esta funcin puede (ue no la necesites muy a menudo ya (ue render$% es
autom%ticamente llamada al final de cada accin del controlador y ser% renderi3ada la
'ista con el mismo nombre de la accin del controlador. .n uso alternati'o podra ser
ejecutar esta funcin en cual(uier parte de la lgica del controlador.
;edireccin de >suarios
redirect
o string $url
;ndica al usuario )acia dnde dirigirse. +a ."+ usada como par%metro puede ser una
."+ interna del Cake o una ."+ del tipo )ttp@GG."+
,lash
o string $mensaje
o string $url
o int $pausa
Esta funcin muestra Smensaje por la cantidad Spausa de segundos dentro del layout de
flas) (ubicado en appG'iewsGlayoutsGflas).t)tml) luego redirecciona al usuario a la Surl
especificada.
+as funciones redirect$% y flas/$% de Cake no incluyen una llamada a e,it$%. 0i
deseas (ue tu aplicacin termine luego de un redirect$% o flas/$% deber%s inclur tu
propia llamada a e,it$% inmediatamente despAes. 7ambi8n probablemente sea
preferible llamar a return en 'e3 de e,it$% dependiendo de la situacin (por ejemplo
si necesitas (ue se ejecute un callback).
Call)acks de Controlador
+os controladores de Cake incorporan algunos callbacks (ue pueden ser usados para
ejecutar cdigo antes o despAes de alguna funcin del controlador. Para utili3ar esta
funcionalidad se deben declarar estas funciones en tu controlador usando los par%metros
y 'alores de retorno ac% detallados.
)e,ore:ilter
+lamada antes de cada accin del controlador. +a funcin perfecta para 'erificar
sesiones acti'as y pri'ilegios de usuarios.
a,ter:ilter
+lamada despu8s de cada accin del controlador.
)e,ore;ender
+lamada despu8s de la lgica del controlador y justo antes (ue una 'ista es renderi3ada.
(tras :unciones @tiles
* pesar de (ue estas funciones son parte de la clase #bject de Cake tambi8n estan
disponibles dentro de un Controlador@
request/ction
o string $url
o array $extra
Esta funcin llama una accin del controlador desde cual(uier ubicacin y de'uel'e su
'ista renderi3ada. +a Surl es una ."+ de Cake
(GnombrecontroladorGnombreaccionGparametros). 0i el arreglo Se&tra incluye el indice
IreturnI *uto"ender es autom%ticamente dejado en true para la accin del controlador.
Puedes usar re(uest*ction para obtener datos desde otra accin del controlador u
obtener una 'ista totalmente renderi3ada desde un controlador.
Primero obtener los datos desde un controlador es muy simple. 0lo debes usar
re(uest*ction en la 'ista donde se necesitan los datos.
002c nuestro controlador simple:

class "sersController e,tends 2ppController
A
function get"ser+ist$%
A
return Gt/is&'"ser&'find2ll$%C
D
D
;magine (ue necesitamos crear una tabla simple (ue muestre los usuarios del sistema.
En 'e3 de duplicar el cdigo de otro controlador podemos obtener los datos de
"sersController::get"ser+ist$% usando re.uest2ction$%.
class (roductsController e,tends 2ppController
A
function s/o*"ser(roducts$%
A
Gt/is&'set$?users?, Gt/is&
're.uest2ction$?0users0get"ser+ist?%%C

00 2/ora la variale Gusers en la vista tendr los datos de
00 "sersController::get"ser+ist$%.
D
D
0i tienes un elemento no est%tico y muy usado en tu aplicacin podras usar
re.uest2ction$% para inyectarlo dentro de tus 'istas. Por ejemplo en 'e3 de pasar
datos desde "sersController::get"ser+ist$% podramos (uierer renderi3ar la 'ista
de esa accin ((ue podra consistir en una tabla) dentro de otro controlador. Esto nos
a)orra duplicar cdigo en la 'ista.
class (rogramsController e,tends 2ppController
A
function vie*2ll$%
A
Gt/is&'set$?user@ale?, Gt/is&
're.uest2ction$?0users0get"ser+ist?, array$?return?%%%C

00 2/ora podemos mostrar Guser@ale en la vista de esta accion
para
00 ver la vistas renderizada .ue tamiJn esta disponile en
0users0get"ser+ist.
D
D
Por fa'or notar (ue las acciones llamadas usando re.uest2ction$% son renderi3adas
usando un layout 'aco ! de esta manera no debe preocuparse acerca de layouts siendo
renderi3adas en layouts.
+a funcin re.uest2ction$% tambi8n es Atil en *4*5 donde un pe(ue<o elemento de
una 'ista podria ser poblado antes o durante una actuali3acin *4*5.
lo-
o string $message
o int $tipo = LOG!""O"
Puedes usar esta funcin para guardar un log de diferentes e'entos (ue ocurren dentro
de tu aplicacin web. +os logs (uedan guardados en el directorio 2t*p de Cake.
0i Stipo e(ui'ale a la constante +#>D/EF.> de PHP el mensaje ser% escrito al log
como un mensaje de tipo debug. Cual(uier otro tipo es escrito al log como un error.
00 4entro de un controlador se puede usar log$% para escriir:

Gt/is&'log$?Mayday> Mayday>?%C

00 Entrada +og:

MK&ML&;V MV:MK:;; Error: Mayday> Mayday>

Gt/is&'log$"(arece .ue el usuario AG<)E))#O8P?user?QD acaa de
ingresar.", +O!<4E7"!%C

00 Entrada +og:

MK&ML&;V MV:MK:;; 4eug: (arece .ue el usuario 7oy acaa de
ingresar.
postConditions
o array $data
.n m8todo para pasarle St)isXdata y este retornar% un arreglo formateado como un
arreglo de condiciones para ser usado en un modelo.
Por ejemplo si tengo un formulario de bAs(ueda de personas@
00 app0vie*s0people0searc/.t/tml:

=Ip/p ec/o G/tml&'input$?(erson0last<name?%C I'
En'iando el formulario con este elemento resultara en el siguiente arreglo St)isXdata@
2rray
$
P(ersonQ H' 2rray
$
Plast<nameQ H' 2nderson
%
%
*)ora podemos usar postConditions$% para darle formato a estos datos y usarlo en un
modelo@
00 app0controllers0people<controller.p/p:

Gconditions H Gt/is&'postConditions$Gt/is&'data%C

00 5esulta un arreglo como este:

2rray
$
P(erson.last<nameQ H' 2nderson
%

00 Wue puede ser usando en las operaciones find de un modelo:

Gt/is&'(erson&'find2ll$Gconditions%C
$eccin '
(aria)les de Controlador
1anipular algunas 'ariables especiales dentro de tu controlador permite apro'ec)ar
algo de funcionalidad e&tra de Cake@
Ana*e
* PHP , no le agrada usar el nombre de la clase actual en CamelCase. .sa esta 'ariable
para setear el nombre CamelCased correcto si tienes problemas.
Auses
7u controlador usa m%s de un modeloN 7u 6ragglesController cargar% autom%ticamente
St)isX6raggle pero si tambi8n necesitas St)isX0murf prueba agregando algo como
esto en tu controlador@
var Guses H array$?Braggle?,?)murf?%C
Por fa'or obser'ar (ue es necesario incluir tambi8n el modelo 6raggle en el arreglo
Suses a pesar de (ue antes estu'o autom%ticamente disponible.
Ahelpers
.sa esta 'ariable para (ue tu controlador cargue )elpers dentro de sus 'istas. El )elper
H71+ es cargado autom%ticamente pero puedes usar esta 'ariable para especificar
algunos otros@
var G/elpers H array$?Ftml?,?2-a,?,?Xavascript?%C
"ecuerda (ue debes incluir el HtmlHelper en el arreglo S)elpers si (uieres usarlo.
$ormalmente est% disponible por defecto pero si defines S)elpers sin 8l tendr%s
mensajes de error en tus 'istas.
Ala<out
0etear esta 'ariable con el nombre del layout (ue te gustara usar para este controlador.
Aauto;ender
*l setear esta 'ariable a ,alse tus acciones dejar%n de ser renderi3adas autom%ticamente.
A)e,ore:ilter
0i (uieres (ue algo de cdigo se ejecute cada 'e3 (ue una accin es llamada (y antes
(ue se ejecute el cdigo de esa accin) puedes usar Sbefore6ilter. Esta funcionalidad es
muy buena para el control de acceso ! puedes 'erificar los permisos de un usuario antes
(ue se ejecute una accin. Esta 'ariable debe ser seteada usando un arreglo (ue
contenga la(s) accion(es) del controlador (ue deseas se ejecuten@
class (roductsController e,tends 2ppController
A
var GeforeBilter H array$?c/ec12ccess?%C

function c/ec12ccess$%
A
00+gica para verificar la identidad de usaurio y su acceso
D

function inde,$%
A
00Cuando se llame a esta accin, primero ser e-ecutada la
accin c/ec12ccess$%
D
D
Aco*ponents
*l igual (ue S)elpers y Suses esta 'ariable es usada para cargar componentes (ue
(uieres usar@
var Gcomponents H array$?acl?%C
$eccin +
Par*metros de Controlador
+os par%metros del controlador est%n disponibles en St)isXparams en tu controlador
Cake. Esta 'ariable es usada para traer datos dentro del controlador y para pro'eer
informacin de acceso acerca de la actual solicitud. El uso m%s comAn de St)isXparams
es para tener acceso a la informacin (ue )a sido entregada al controlador mediante las
operaciones P#07 o >E7.
AthisBCdata
.sado para manjear los datos P#07 en'iados desde formularios H71+ Helper al
controlador.
00 "n F@M+ Felper es usado para crear un elemento de formulario

G/tml&'input$?"ser0first<name?%C

00 2l ser renderizado como F@M+ se ver as3:

=input nameH"dataP"serQPfirst<nameQ" valueH"" typeH"te,t" 0'

00 R cuando sea enviado al controlador mediante (O)@,
00 aparecer en Gt/is&'dataP?"ser?QP?first<name?Q

2rray
$
PdataQ H' 2rray
$
P"serQ H' 2rray
$
PusernameQ H' mrrogers
Ppass*ordQ H' mynLig/Mr
Pfirst<nameQ H' Mister
Plast<nameQ H' 5ogers
%

%
%
AthisBCpara*sDE,or*EF
/atos P#07 de cual(uier tipo son almacenados ac% incluyendo informacin encontrada
en SD6;+E0.
AthisBCpara*sDE)areEF
*lmacena ICI si el actual layout esta 'aco I:I de lo contrario.
AthisBCpara*sDEa9a4EF
*lmacena ICI si el actual layout es aja& I:I de lo contrario.
AthisBCpara*sDEcontrollerEF
*lmacena el nombre del controlador (ue est% manejando la solicitud. Por ejemplo si
fue llamada la ."+ GpostsG'iewGC St)isXparams[IcontrollerI\ ser% igual a =posts?.
AthisBCpara*sDEactionEF
*lmacena el nombre de la 'ista (ue est% menejando la solicitud. Por ejemplo si fue
llamada la ."+ GpostsG'iewGC St)isXparams[IactionI\ ser% igual a ='iew?.
AthisBCpara*sDEpassEF
*lmacena el (uery string del >E7 en'iado con la actual solicitud. Por ejemplo si fue
llamada la ."+ GpostsG'iewGN'arCOB_'ar9O, St)isXparams[IpassI\ ser% igual a
?N'arCOB_'ar9O,?.
AthisBCpara*sDEurlEF
*lmacena la ."+ solicitada junto con pares lla'e!'alor de 'ariables get. Por ejemplo
si fue llamada la ."+ GpostsG'iewGN'arCOB_'ar9O, St)isXparams[IurlI\ ser% algo
como esto@
PurlQ H' 2rray
$
PurlQ H' posts0vie*
Pvar:Q H' L
Pvar;Q H' N
%
[!ste cap#tulo ha sido traducido por "icardo Mun$o% &'\
Vistas
Vistas
.na 'ista es una plantilla usualmente llamada ante una accin. Por ejemplo la 'ista
(ost)ontroller**add+, ser% encontrada en -app-views-post-add'thtml. +as 'istas en Cake
son simples arc)i'os PHP asi puede usar cdigo PHP dentro de ellas. *un(ue la
mayoria de sus arc)i'os de 'ista contienen H71+ una 'ista puede ser ciertamente un
grupo de datos ser un 51+ una imagen etc. En la plantilla del arc)i'o 'ista puede
usar los datos desde el correspondiente modelo. Estos datos son pasados como un array
llamado $data. Cual(uier dato (ue usted maneje en la 'ista usando set() en el
controlador est% tambien disponible en su 'ista.
+ota
El )elper H71+ est% disponible en cual(uier 'ista por defecto y es lejos el )elper mas
usado en las 'istas. Es muy Atil en la creacin de formularios incluyendo scripts y
multimedia enla3ando y agregando 'alidacion de datos. Por fa'or 'ea la seccion C en
el capitulo =Helpers? para una discusion del )elper H71+.
+a mayoria de las funciones disponibles en las 'istas son pro'istas por Helpers. Cake
'iene con un gran set de )elpers (discutido en el capitulo =Helpers?) y usted puede
incluir el suyo. Por (ue las 'istas no contienen muc)a lgica no )ay muc)as funciones
publicas en la clase 'ista. .no (ue es Atil es renderElement() (uien ser% e&plicado en la
seccin C.9.
6a<outs
.n layout contiene todo el codigo de presentacion (ue se oculta alrededor de una 'ista.
Cual(uier cosa (ue (uiera 'er en todas sus 'istas debe estar en su layout. +os arc)i'os
+ayout estan ubicados en -app-views-layouts. El layout por defecto puede ser sobre
escrito colocando un nue'o layout en -app-views-layouts-de.ault'thtml. .na 'e3 (ue el
nue'o layout por defecto es creado el cdigo contralador de la 'ista es puesto dentro
del layout por defecto cuando la p%gina es recargada. Cuando usted crea un layout
necesita decirle a Cake donde poner el codigo del controlador@ para )acer esto
asegurese (ue su layout incluye un lugar para $content.orlayout (y opcionalmente
$title.orlayout). *(ui )ay un ejemplo de como debe 'erse un layout por defecto@
=>4OC@R(E /tml ("7+#C "&00OLC004@4 YF@M+ :.M @ransitional00E8"
"/ttp:00***.*L.org0@50,/tml:04@40,/tml:&transitional.dtd"'
=/tml ,mlnsH"/ttp:00***.*L.org0:ZZZ0,/tml"'
=/ead'
=title'=Ip/p ec/o Gtitle<for<layoutI'=0title'
=lin1 relH"s/ortcut icon" /refH"favicon.ico" typeH"image0,&icon"'
=0/ead'
=ody'
=>&& #f you?d li1e some sort of menu to s/o* up on all of your vie*s,
include it /ere &&'
=div idH"/eader"'
=div idH"menu"'...=0div'
=0div'
=>&& Fere?s */ere # *ant my vie*s to e displayed &&'
=Ip/p ec/o Gcontent<for<layout I'
=>&& 2dd a footer to eac/ displayed page &&'
=div idH"footer"'...=0div'
=0ody'
=0/tml'
Para asignar el titulo del layout es f%cil )acerlo en el controlador usando la 'ariable de
controlador Spage7itle.
class "sersController e,tends 2ppController
A
function vie*2ctive$%
A
Gt/is&'page@itle H ?Vie* 2ctive "sers?C
D
D
Puede crear cuantos layouts (uiera para su sitio con Cake solo colo(uelos en el
directorio appG'iewsGlayouts y cambie entre ellos dentro del sus acciones en el
controlador usando la 'ariable Slayout o la funcion set+ayout(). Por ejemplo si una
seccin de mi sitio incluye un espacio para un banner pe(ue<o. Puedo crear un nue'o
layout con un espacio pe(ue<o para publicidad y especificar (ue este es el layout por
defecto a las acciones del controlador usando algo como esto@
var Glayout H ?default<small<ad?C
Ele*entos
1uc)as aplicaciones tienen codigos pe(ue<os en blo(ues de presentacion (ue necesitan
ser repetidos p%gina a p%gina algunas 'eces en lugares diferentes en el layout. Cake
puede ayudar a repetir partes de su sitio web (ue necesitan ser reusadas. Esas partes
reusables son llamada Elementos. *nuncios cajas de ayuda contrles de na'egacion
menAs e&tras y llamadas son a menudo implementados en Cake como elementos. .n
elemneto es basicamente una mini!'ista (ue puede ser usada en otras 'istas. +os
elementos 'i'en en la carpeta -app-views-elementsG y tienen la e&tension de arc)i'o
'thtml
,-emplo ./0 1lamando un ,lemento sin parametros
=Ip/p ec/o Gt/is&'renderElement$?/elpo,?%C I'
,-emplo ./2 1lamando un ,lemento pasando datos en un array
=Ip/p ec/o Gt/is&'renderElement$?/elpo,?,array$"/elpte,t"H'"O/, t/is
te,t is very /elpful"%%C I'
/entro del arc)i'o Elemento todas las 'ariables pasadas estan disponibles con el
nombre de las lla'es del array (muy parecido como set() trabaja en el controlador con
las 'istas). En el ejemplo de arriba el arc)i'o -app-views-elements-helpbox'thtml puede
usar la 'ariable $helptext. /esde luego podra ser m%s pr%ctico pasar un array al
elemento. +os elementos pueden ser usados para )acer una 'ista mas facil de leer
colocando la presentacin del elemento repetido en su propio arc)i'o. Pueden ayudarle
tambien a reusar fragmentos de contendido en su sitio web.
Co*ponentes
Presentacin
+os componentes se utili3an para ayudar a los controladores en situaciones especficas.
En lugar de e&tender las bibliotecas del motor de Cake funcionalidades especiales se
pueden poner en los componentes. .n tipo llamado olle en el canal ;"C dijo una 'e3@ "n
componente es un pe.ue6o [controlador\ compartido. Esta nos parece una
buena definicin. 0u objeti'o principal es@ reusabilidad. +os componentes son a los
controladores lo (ue los )elpers son a las 'istas. +a diferencia principal es (ue los
componentes encapsulan l-ica de acciones mientras los )elpers encapsulan lgica de
presentacin. Este punto es muy importante una confusin comAn para nue'os Fakers
cuando tratan de obtener reusabilidad@ Estoy tratando de )acer 5 KTdebera )acer un
componente o un )elperNL Pues la respuesta es muy simple T(u8 )ace 5N Hace lgica
de acciones o lgica de presentacin To tal 'e3 ambasN 0i es lgica de acciones
entonces es un componente. 0i es lgica de presentacin entonces es un )elper. 0i es
ambas entonces..es tanto un componente como un )elper. .n ejemplo de esto Altimo
sera un sistema de identificacin. .sted (uerra ingresar salir restringir acceso y
probar permisos de un usuario a un recurso (una accin@ editar a<adir borrar.. o una
url) esto es lgica de acciones as (ue este sistema sera un componente. Pero tambi8n
(uiere a<adir entradas en el menA principal cuando el usuario a ingresado al sistema y
esto es lgica de presentacin.
Creando su propio co*ponente
Para crear un componente a<ada un arc)i'o al directorio
app2controllers2co*ponents2.
0upongamos (ue )a creado ,oo.php. /entro de este arc)i'o tiene (ue definir una clase
(ue corresponda al nombre del arc)i'o (adjuntando la palabra IComponentI al nombre
del arc)i'o). *s en este caso se creara lo siguiente@
3n componente simple
class BooComponent e,tends O-ect
A
var GsomeVar H nullC
var Gcontroller H trueC

function startup$]Gcontroller%
A
00 Este mJtodo /ace una referencia al controlador .ue esta
cargando el componente.
00 2.u3 se inicializa el controlador.
D

function doBoo$%
A
Gt/is&'someVar H ?foo?C
D
D
*)ora para usar su componente tiene (ue a<adir lo siguiente a la definicin de su
controlador@
var Gcomponents H array$?Boo?%C
/entro del controlador a)ora puede usar@
Gt/is&'Boo&'doBoo$%C
.n componente obtiene acceso al controlador (ue lo carga a tra'8s del m8todo startup()
mostrado arriba. Este m8todo es llamado inmediatamente despu8s de
Controller@@before6ilter(). Esto le permite definir las propiedades (ue el componente
necesita en su m8todo startup() en el m8todo before6ilter. Para usar sus modelos dentro
de los componentes puede crear una nue'a instancia as@
Gfoo H]ampC ne* Boo$%C
7ambi8n puede usar otros componentes dentro del componente. 0implemente declare es
el componente los componentes (ue (uiera usar. En el ejemplo siguiente es el
componente de sesiones.
var Gcomponents H array$?)ession?%C
Pu)licando sus co*ponentes
0i cree (ue sus componentes pueden ser Atiles para otras personas puede agregarlo a
Cake6orge. .n componente (ue se 'uel'a bastante Atil para la comunidad podra llegar
a ser incluido en la distribucin principal.
7ambi8n 'ea el arc)i'o de snippets para encontrar componentes en'iados por los
usuarios.
$eccin %
Helpers
Helpers (ayudantes) )an sido pensados para pro'eer de funciones (ue son comAnmente
necesitadas en las 'iews ('istas) para formatear y presentar los datos de maneras Atiles.
H4%1
Introduccin
El )elper H71+ es una de las maneras (ue utili3a Cake para )acer al desarrollo menos
montono y m%s r%pido. El )elper H71+ tiene dos objeti'os principales@ ayudar en la
insercin de secciones de cdigo H71+ (ue se repiten continuamente y ayudar en la
creacin r%pida y simple de formularios web. +as secciones siguientes le lle'ar%n a
tra'8s de las funciones m%s importantes en este )elper pero recuerde (ue
)ttp@GGapi.cakep)p.org siempre ser% la referencia definiti'a sobre 8ste.
1uc)as de las funciones en el )elper H71+ )acen uso de un fic)ero de definicin de
eti(uetas H71+ llamado ta-s.ini.php. Cake trae un tags.ini.p)p en su configuracin
pero si (uisiera )acerle algunos cambios cree una copia de 2cake2con,i-2ta-s.ini.php y
col(uela en su directorio 2app2con,i-2. El )elper H71+ utili3a las definiciones de
eti(uetas en este fic)ero para generar las eti(uetas (ue solicite. .sar el )elper H71+
para crear parte del cdigo de su 'iew puede ser Atil debido a (ue cambios al fic)ero
tags.ini.p)p resultar%n en un cambio a ni'el de toda la aplicacin.
*dicionalmente si en el fic)ero de configuracin de su aplicacin
(2app2con,i-2core.php) el par%metro *.7#D#.7P.7 es puesto a true el )elper
escribir% la eti(ueta autom%ticamente en lugar de de'ol'er el 'alor. Esto es un esfuer3o
de apaciguar a (uienes no les agrada las eti(uetas cortas (WNO NV) o muc)as funciones
ec)o() en el cdigo del 'iew. +as funciones (ue incluyan el parametro Sreturn permiten
sobreescribir la configuracin del fic)ero de configuracin. /efina Sreturn como true si
(uiere (ue el )elper H71+ retorne el cdigo H71+ sin )acer caso a como est8
definido *.7#D#.7P.7.
+as funciones del )elper H71+ tambi8n incluyen un parametro S)tml*ttributes (ue
permite a<adir cual(uier atributo e&tra a sus eti(uetas. Por ejemplo si (uisiera a<adir un
atributo class colocara esto como 'alor de S)tml*ttribute@
array$?class?H'?someClass?%
Insertar ele*entos )ien ,or*ados
0i (uisiera usar Cake para insertar elementos bien formados y repetidos constantemente
en su cdigo H71+ el )elper H71+ es grandioso para )acerlo. Hay funciones en este
)elper en insertan media ayuda con las tablas y )ay incluso guiList/ree el cual crea una
lista sin ordenar basada en un array de PHP.
charset
o string Sc)arset
o boolean Sreturn
Este se usa para generar una eti(ueta 1E7* de codificacin de caracteres.
css
o string Spat)
o string Srel O Istyles)eetI
o array S)tml*ttributes
o boolean Sreturn O false
Crea un enlace a una )oja de estilo C00. El par%metro Srel permite colocar un atributo
relO 'alue en la eti(ueta.
i*a-e
o string Spat)
o array S)tml*ttributes
o boolean Sreturn O false
Crea una eti(ueta de imagen. El cdigo (ue retorna esta funcin puede ser usado como
par%metro de la funcin link() para crear im%genes con )iper'inculos autom%ticamente.
link
o string Stitle
o string Surl
o array S)tml*ttributes
o string Sconfirm1essage O false
o boolean Sescape7itle O true
o boolean Sreturn O false
Esta funcin crea )iper'inculos en el 'iew. Sconfirm1essage es usado cuando se
necesita un mensaje de confirmacin 'a 4a'a0cript una 'e3 el enlace es pulsado. Por
ejemplo un enlace (ue borra un objeto debera tener probablemente un mensaje de
=TEsta seguroN? para confirmar la accin antes de (ue el )iper'inculo sea acti'ado.
/efina Sescape7itle como true si (uiere (ue el )elper H71+ escape los datos (ue en'a
en la 'ariable Stitle.
ta)leHeaders
o array Snames
o array StrDoptions
o array St)Doptions
.sado para crear las cabeceras de una tabla.
ta)leCells
o array Sdata
o array SoddDtrDoptions
o array Se'enDtrDoptions
.sado para crear un grupo de celdas formateadas.
-ui6istGree
o array Sdata
o array S)tml*ttributes
o string SbodyHey O IbodyI
o string Sc)ildrenHey O Ic)ildrenI
o boolean Sreturn O false
>enera una lista de %rbol sin ordenar y anidada a partir de un array.
'ormularios y validacin
El )elper H71+ brilla cuando es momento de agili3ar la insercin de formularios en
sus 'iews. >enera todas las eti(uetas de formulario rellena 'alores autom%ticamente en
caso de errores y muestra mensajes de error. Para ayudar a ilustrar esto un r%pido
ejemplo. ;magine por un momento (ue su aplicacin tiene un model 0ote y (uiere crear
lgica de control y una 'ista para a<adir y editar objetos $ote. En su $otesController
tendra una accin edit (ue podra lucir as@
Accin ,dit dentro de +otesController
function edit$Gid%
A
00(rimero, revisamos si /an sido enviados datos en el formulario
00a la accin.
if $>empty$Gt/is&'dataP?8ote?Q%%
A
002.u3 tratamos de validar los datos del formulario $ver Cap.
:;%
00y guardarlos
if $Gt/is&'8ote&'save$Gt/is&'dataP?8ote?Q%%
A
00)i se guardan e,itosamente, llevar al usuario
00al lugar apropiado
Gt/is&'flas/$?Rour information /as een saved.?,
?0notes0edit0? . Gid%C
e,it$%C
D
else
A

00!enerar los mensa-es de error para los campos apropiados
00esto no es realmente necesario ya .ue al guardar se /ace
esto, pero es una llamada
00de e-emplo a Gt/is&'8ote&'validates$Gt/is&
'dataP?8ote?Q%C si no est usando save
00entonces use el mJtodo de aa-o para llenar la funcin
de /elper tagErrorMsg$%.
Gt/is&'validateErrors$Gt/is&'8ote%C

00R muestre el cdigo de la vista edit
Gt/is&'render$%C
D
D

00 )i no se /a reciido ning9n dato en el formulario, otener la
note .ue .ueremos editar, y enviar
00 est informacin a la vista
Gt/is&'set$?note?, Gt/is&'8ote&'find$"id H Gid"%%C
Gt/is&'render$%C
D
7eniendo ya nuestro controller listo 'eamos el cdigo de la 'ista ((ue se encontrara en
app2!ie3s2notes2edit.tht*l). El modelo $ote es bastante simple en este punto ya (ue
solo contiene un id el id del usuario y el cuerpo del mensaje. Este cdigo sir'e para
mostrar los datos de $ote y permite al usuario ingresar nue'os 'alores y guardar los
datos en el modelo.
El )elper H71+ est% disponible en todas las 'istas por omisin y puede accesarse a el
usando S)tml.
Especficamente miremos a la tabla donde encontramos las entra<as del formulario@
Cdigo de e-emplo de la vista ,dit 5edit/thtml6
=>&& @/is tag creates our form tag &&'

=Ip/p ec/o G/tml&'form@ag$?0notes0edit0? . G/tml&
'tagValue$?8ote0id?%I'

=tale cellpaddingH":M" cellspacingH"M"'
=tr'
=td alignH"rig/t"'7ody: =0td'
=td'

=>&& Fere?s */ere *e use t/e F@M+ /elper to render t/e te,t
area tag and its possile error message t/e Gnote
variale *as created y t/e controller, and contains
t/e data for t/e note *e?re editing. &&'
=Ip/p ec/o
G/tml&'te,tarea$?8ote0ody?, array$?cols?H'?KM?, ?ro*s?H'?:M?%%C
I'
=Ip/p ec/o G/tml&'tagErrorMsg$?8ote0ody?,
?(lease enter in a ody for t/is note.?% I'
=0td'
=0tr'
=tr'
=td'=0td'
=td'

=>&& Oe can also use t/e F@M+ /elper to include
/idden tags inside our tale &&'

=Ip/p ec/o G/tml&'/idden$?8ote0id?%I'
=Ip/p ec/o G/tml&'/idden$?note0sumitter<id?, Gt/is&'controller&
')ession&'read$?"ser.id?%%I'
=0td'
=0tr'
=0tale'

=>&& 2nd finally, t/e sumit utton&&'
=Ip/p ec/o G/tml&'sumit$%I'

=0form'
+a mayor parte de las funciones (ue generar el formulario (junto con tagError1sg)
re(uieren (ue proporcione un Sfield$ame. Este Sfield$ame permite a Cake saber (ue
datos est% pasando para (ue pueda guardar y 'alidar los datos correctamente. +a cadena
pasada en el par%metro Sfield$ame se escribe en la manera `modelnameGfieldname.a 0i
fuera a a<adir un campo de ttulo a nuestro $ote necesitara a<adir algo a la 'ista (ue
lu3ca as@
=Ip/p ec/o G/tml&'input$?8ote0title?% I'
=Ip/p ec/o G/tml&'tagErrorMsg$?8ote0title?, ?(lease supply a title for
t/is note.?%I'
+os mensajes de error mostrados por la funcin tagError1sg() se en'uel'en en _ltYdi'
classO=errorDmessage?_gtY_ltYGdi'_gtY para utili3ar C00 con mayor facilidad.
*(u est%n las eti(uetas (ue el )elper H71+ puede generar (la mayora son sencillas)@
su)*it
o string SbuttonCaption
o array S)tml*ttributes
o boolean Sreturn O false
pass3ord
o string Sfield$ame
o array S)tml*ttributes
o boolean Sreturn O false
te4tarea
o string Sfield$ame
o array S)tml*ttributes
o boolean Sreturn O false
check)o4
o string Sfield$ame
o array S)tml*ttributes
o boolean Sreturn O false
,ile
o string Sfield$ame
o array S)tml*ttributes
o boolean Sreturn O false
hidden
o string Sfield$ame
o array S)tml*ttributes
o boolean Sreturn O false
input
o string Sfield$ame
o array S)tml*ttributes
o boolean Sreturn O false
radio
o string Sfield$ame
o array Soptions
o array Sinbetween
o array S)tml*ttributes
o boolean Sreturn O false
ta-ErrorMs-
o string Sfield$ame
o string Smessage
El )elper H71+ tambi8n incluye un set de funciones (ue ayudan en la creacin de
eti(uetas de opciones relacionadas con fec)as. El par%metro Stag$ame debera ser
manejado de la misma manera (ue el par%metro Sfield$ame. 0olo pro'ea el nombre del
campo para el (ue esta eti(ueta de fec)a es rele'ante. .na 'e3 la data es procesada la
'er% en el controller con la parte de la fec)a (ue maneja concatenado al final del nombre
del campo. Por ejemplo si mi $ote tiene un campo deadline del tipo fec)a y si el
par%metro Stag$ame de la funcin day#ption7ag fuera `noteGdeadlinea el dato de da
se mostrara en la 'ariable Sparams una 'e3 el formulario )aya sido en'iado a la accin
de un controller@
Gt/is&'dataP?8ote?QP?deadline<day?Q
Puede entonces utili3ar esta informacin para concatenar el dato de tiempo en un
formato (ue es amigable con la configuracin de su base de datos. Este cdigo se
colocara justo antes de intentar guardar los datos y metido al array Sdata usado para
guardar la informacin en el modelo.
Concatenar datos de tiempo antes de guardar un modelo 5e7tracto
de +otesController6
function edit$Gid%
A
00Birst, let?s c/ec1 to see if any form data /as een sumitted
to t/e action.
if $>empty$Gt/is&'dataP?8ote?Q%%
A

00Concatenate time data for storage...
Gt/is&'dataP?8ote?QP?deadline?Q H
Gt/is&'dataP?8ote?QP?deadline<year?Q . "&" .
Gt/is&'dataP?8ote?QP?deadline<mont/?Q . "&" .
Gt/is&'dataP?8ote?QP?deadline<day?QC

00Fere?s */ere *e try to validate t/e form data $see C/ap.
:M% and save it
if $Gt/is&'8ote&'save$Gt/is&'dataP?8ote?Q%%
A

...
day#ption7ag (Stag$ame S'alueOnull SselectedOnull Soption*ttrOnull)
year#ption7ag (Stag$ame S'alueOnull SminbearOnull Sma&bearOnull
SselectedOnull Soption*ttrOnull)
mont)#ption7ag (Stag$ame S'alueOnull SselectedOnull Soption*ttrOnull)
)our#ption7ag (Stag$ame S'alueOnull Sformat9,HoursOfalse SselectedOnull
Soption*ttrOnull)
minute#ption7ag (Stag$ame S'alueOnull SselectedOnull Soption*ttrOnull)
meridian#ption7ag (Stag$ame S'alueOnull SselectedOnull Soption*ttrOnull)
date7ime#ption7ag (Stag$ame Sdate6ormatO I/1bI Stime6ormatO IC9I
SselectedOnull Soption*ttrOnull)
A8A9
El )elper de *ja& de Cake utili3a las populares bibliotecas Prototype y script.aculo.us
para operaciones *ja& y efectos en el lado del cliente. Para poder utili3ar este )elper
debe tener una 'ersin actual de las bibliotecas de 4a'ascripte de )ttp@GGscript.aculo.us
en 2app23e)root29s2. *dem%s cual(uier 'ista (ue planea utili3ar el Helper *ja&
necesitar% incluir esas bibliotecas.
+a mayora de las funciones en este )elper esperan un array especial Soptions como
par%metro. Este array se utili3a para especificar diferentes cosas acerca de la operacin
*ja&. +os diferentes 'alores (ue se puede especificar son@
A-a7Helper :options ;eys
8avascript
+um)er
4e7t
4ime
Cache
$eccin &
C*o crear tus propios Helpers
T$ecesita ayuda con el cdigo de su 'istaN 0i se encuentra necesitando una lgica de
'ista especfica una y otra 'e3 puede )acer su propio )elper.
E4tendin- the Cake Helper Class
<app<vies<helpers<link/php
<app<vies<helpers<link/php 5logic added6
Includin- other Helpers
<app<vies<helpers<link/php 5using other helpers6
3sing your Custom Helper
Contri)uting
Constantes Hlo)ales < :unciones de
Cakephp
*(u )ay algunas constantes globales y funciones (ue puede ser (ue encuentres Atiles
para )acer tu aplicacin con Cake.
:unciones Hlo)ales
*(u est%n las funciones disponibles de Cake. 1uc)as son con'enientes atajos de
nombres funciones de p)p pero algunas (como 2endor() y uses()) pueden ser incluidas
en el cdigo o reali3ar otras funciones Atiles. 0i buscas una pe(ue<a funcin (ue )aga
algo (ue tengas (ue )acer en repetidas ocasiones. Este es el lugar adecuado para
encontrarla.
Config
Carga el arc)i'o de configuracin base de cake
.ses
o cadena SlibC
o cadena Slib9^
.tili3ado para cargar las bibliotecas base de cake ((ue est%n en cake2li)s2). /a el
nombre del arc)i'o de la biblioteca sin la e&tensin p)p
uses$?sanitize?,?security?%C
'endor
o cadena SlibC
o cadena Slib9..
0e usa para cargar bibliotecas e&ternas (ue se encuentran en el directorio 2!endor. /a el
nombre del arc)i'o sin la e&tensin p)p
vendor$?myOe)ervice?,?nusoap?%C
debug
o mi&ta S'ar
o booleana Ss)owH71+ O false
0i el ni'el de la aplicacin no es cero S'ar sera impresa si Ss)owH71+ es true los
datos ser%n mostrados de una forma agradable para el na'egador.
a
"egresa un arreglo con los par%metros (ue fueron usados para llamar la funcin
function algunaBuncion$% A
ec/o print<r$a$?Boo?,?ar?%%C
D

algunaBuncion$%C

00imprime:

array$
PMQ H' ?foo?,
P:Q H' ?ar?
%C
aa
.sada para crear arreglos asociati'os formados por los par%metros (ue se le pasan a la
funcin
ec/o aa$?a?,??%C

00imprime:
array$?a?H'??%
e
o cadena Ste&t
Es un con'eniente atajo para ec)o()
low
Es un con'eniente atajo para strtolower()
up
Es un con'eniente atajo para strtoupper()
r
o cadena Ssearc)
o cadena Sreplace
o cadena Ssubject
Es un con'eniente atajo para strDreplace()
pr
o mi&to Sdata
Es un con'eniente atajo para@
ec/o "=pre'".print<r$Gdata%."=0pre'"C
0olo se imprime si debug no es cero
am
o arreglo SarrayC
o arreglo Sarray9^
6usiona los arreglos (ue se le pasan a la funcin
en'
o cadena Skey
#btiene una 'ariable de las fuentes disponibles. Es usada como respaldo si SD0E"2E"
o SDE$2 est%n in)abilitadas
Esta funcin tambi8n emula PHPD0E+6 y /#C.1E$7D"##7 en los ser'idores (ue
no las soportan. /e )ec)o es un buena idea usar siempre en'() en lugar de SD0E"2E" o
geten'() (especialmente si tu plan es distribuir cdigo) puesto (ue es un atajo lleno
emulaciones.
cac)e
o cadena Spat)
o cadena Se&pire
o cadena Starget O Icac)eI
Escribe la informacin en una 'ariable Sdata en la ruta GappGtmp especificada por la
'ariable Spat) como cac)e. El tiempo de espiracin se especifica en Se&pire y debe de
ser una cadena de te&to 'alida strtotime(). +a 'ariable Starget puede guardar la
informacin ya sea como Icac)eI o IpublicI
clearCac)e
o cadena Ssearc)
o cadena Spat) O I'iewsI
o cadena Se&t
Es usada para borrar los arc)i'os de las carpetas de cac)e o limpiar el contenido de las
carpetas de cac)e.
0i Ssearc) es una cadena y coincide con el nombre del directorio de cac)e o con algAn
nombre de de arc)i'o ser% entonces remo'ido del cac)e. El par%metro Ssearc) puede ser
pasado como un arreglo con los nombres de los arc)i'osGcarpetas (ue ser%n limpiados.
0i esta 'aca la 'ariable entonces GappGtmpGcac)eG'iews ser% limpiada
El parametro Spat) es usado para especificar cual directorio dentro de GtmpGcac)e ser%
limpiado. Por defecto es I'iewsI
El parametro Se&t es usado para especificar las e&tensiones de los arc)i'os (ue tu
(uieres limpiar
stripslas)esDdeep
o arreglo Sarray
"ecursi'amente (uita las diagonales de todos los 'alores del arreglo
countdim
o arreglo Sarray
"egresa el nAmero de la dimensin en el arreglo pro'isto.
fileE&ists;nPat)
o cadena Sfile
Fusca en la ruta si tiene el arc)i'o regresa el pat) arc)i'o si lo encuentra o false si no
lo encuentra
con'ert0las)
o cadena Sstring
Con'ierte las diagonales en guiones bajos y (uita el primero y el Altimo de la cadena
Constantes de CakePHP
*C+DC+*00$*1E@ El nombre de la clase (ue actualmente esta usandose y
manejandose con las *C+ para cakep)p. Contiene una constante para permitir integrar
clases de terceros.
*C+D6;+E$*1E@ El nombre del arc)i'o donde la clase *C+DC+*00$*1E puede
ser encontrada
*.7#D0E00;#$@ si esta en 6*+0E sessionDstart() no es autom%ticamente llamada
durante cual(uier peticin de la aplicacin
C*CHEDCHECH@ 0i esta en false el cac)e de la 'ista esta desacti'ado para la
aplicacin entera
C*HED0EC.";7b@ /etermina el ni'el de seguridad de la sesin para la aplicacin en
concordancia con C*HED0E00;#$D7;1E#.7. Puede ser puesto como =low?
=medium? o =alto?. /ependiendo de la configuracin C*HED0E00;#$D7;1E#.7 es
multiplicado dependiendo de lo siguiente@
C. low@ B::
9. medium@ C::
B. alto@ C:
C*HED0E00;#$DC##H;E@ el nombre de la cookie de sesin de la aplicacin.
C*HED0E00;#$D0*2E@ Puede ser Ip)pIIfileI o IdatabaseI.
C. p)p@ Cake usa el 'alor por defecto de PHP para el manejo de sesiones
(usualmente definido en el arc)i'o p)p.ini)
9. file@ +a informacin de sesin es guardad y manejada en Gtmp
B. database@ >uarda la sesin en la base de datos ('er el capitulo IComponente de
sesin de cake? para mas detalles)
C*HED0E00;#$D07";$>@ es una cadena aleatoria (ue se usa en el manejo de sesin.
C*HED0E00;#$D7*F+E@ Es el nombre de la tabla (ue se usara para guardar la
informacin de sesin (si C*HED0E00;#$D0*2E OO IdatabaseI). $o incluye el prefijo
si alguno )a sido especificado por defecto en la cone&in de la base de datos.
C*HED0E00;#$D7;1E#.7@ Es el nAmero de segundos )asta (ue la sesin espire.
Esta es multiplicada por C*HED0EC.";7b.
C#1P"E00DC00@ si esta en 7".E las )ojas de estilo de C00 est%n comprimidas. Esto
re(uiere permitir escribir en la carpeta G'arGcac)e. Para usarla se )ace una referencia de
tu )oja de estilo usando Gccss (mas bien como Gcss) o usar css7ag().
/EF.>@ define el ni'el de a'isos de error y de depuracin en la aplicacin )ec)a con
cakep)p cuando esta es mostrada. Puede ser un entero entre : y B
:@ 1odo de produccin. $o muestra errores en la ejecucin. $i mensajes de
depuracin son mostrados
C@ 1odo de desarrollo. 1uesta ad'ertencias y errorescon mensajes de
depuracin
9@ ;gual (ue en C pero con la salida 0E+
B@ ;gual (ue en 9 pero con toda la informacin del objecto actual (usualmente el
controlador)
+#>DE""#"@ Es la constante de error. .sada para diferenciar el error de loggin y
debuggin (=logeo? y depuracin). *ctualmente PHP soporta +#>D/EF.>
1*5D1/-0;ZE@ Es el tama<o m%&imo (en bytes) (ue md-() permitir%
]EF0E"2;CE0@ si esta en true la funcionalidad de cake para webser'ices sera puesta
en marc)a
Constantes para rutas de C/IEPHP
*PP@ Es la ruta de la carpeta de la aplicacin.
*PPD/;"@ El nombre de la carpeta de la aplicacin
*PPDP*7H@ +a ruta absoluta de la carpeta de la aplicacin.
C*CHE@ +a ruta para la carpeta (ue contendr% los arc)i'os de cac)e.
C*HE@ +a ruta para los arc)i'os de C*HE.
C#1P#$E$70@ +a ruta para la carpeta (ue contrendr% los componentes
C#$6;>0@ la ruta para la carpeta con los arc)i'os de configuracin
C#$7"#++E"D7E070@ +a ruta de la carpeta para )acer pruebas
C#$7"#++E"0@ "uta para los controladores de la aplicacin
C00@ +a ruta para los arc)i'os de C00
E+E1E$70@ la ruta para la carpeta (ue contiene los elements
HE+PE"D7E070@ +a ruta para el directorio de pruebas de los HE+PE"0
HE+PE"@ +a ruta para el directorio (ue contiene los HE+PE"0
;$6+EC7;#$0@ +a ruta para la carpeta de infle&iones (usualmente dentro de la carpeta
de configuracin)
40@ "uta para la carpeta (ue contiene los arc)i'os de ja'ascript
+*b#.70@ "uta para la carpeta de layouts
+;FD7E070@ "uta para la carpeta (ue contiene la biblioteca de cake para pruebas
+;F0@ "uta para la carpeta donde est%n las bibliotecas de cake
+#>0@ "uta para la carpeta de logs
1#/E+D7E070@ "uta para la carpeta de pruebas de modelos
1#/E+0@ "uta de la carpeta (ue contiene los modelos
0C";P70@ "uta para la carpeta de scripts de Cake
7E070@ "uta para la carpeta de pruebas (es padre para las carpetas de pruebas de
modelscontrollers etc)
71P@ "uta para la carpeta temporal
2E$/#"0@ "uta para la carpeta 'endors
2;E]0@ "uta para la carpeta 2iews
Con,i-uracin e 6a Carpeta Je);oot
C#"EDP*7H@ ruta donde estan las bibliotecas del nAcleo de Cake
]]]D"##7@ "uta donde esta la carpeta webroot de la aplicacin (usualmente en
GcakeG)
C*HEDC#"ED;$C+./EDP*7H@ "uta donde est%n las bibliotecas del nAcleo de cake
"##7@ El nombre del directorio padre donde esta inde&.p)p de Cakep)p
]EF"##7D/;"@ t)e name of t)e applicationIs webroot directory.
Validacin de datos
$eccin %
(alidacin de datos
Crear reglas de 'alidacin personali3adas puede ayudar a asegurar (ue los datos en un
1odelo `1odela est8n de acuerdo a las reglas del negocio de la aplicacin tales como
contrase<as con longitud de oc)o caracteres nombres de usuario con Anicamente letras
etc.
El primer paso para la 'alidacin de datos es crear las reglas de 'alidacin en el
1odelo. Para )acer esto usa el arreglo Model::validate en la definicin del 1odelo
por ejemplo@
2app2*odels2user.php
=Ip/p
class "ser e,tends 2ppModel
A
var Gname H ?"ser?C
var Gvalidate H array$
?login? H' ?0Pa&zM&Z^<^&QAL,DG0i?,
?pass*ord? H' V2+#4<8O@<EM(@R,
?email? H' V2+#4<EM2#+,
?orn? H' V2+#4<8"M7E5
%C
D
I'
+as 'alidaciones son definidas utili3ando e&presiones regulares compatibles con Perl
algunas de las cuales est%n predefinidas en libsG'alidators.p)p. Estas son@
2*+;/D$#7DE1P7b
2*+;/D$.1FE"
2*+;/DE1*;+
2*+;/DbE*"
0i e&isten 'alidaciones presentes en la definicin del modelo (p.e. en el arreglo
Gvalidate) estas ser%n parseadas y re'isadas durante las operaciones de guardado (p.e.
en el m8todo Model::save$%). Para 'alidar los datos directamente utili3a los m8todos
1odel@@'alidates() (retorna falso si los datos son incorrectos) y 1odel@@in'alid6ields()
(el cual retorna un arreglo de mensajes de error).
Pero usualmente la 'alidacin de datos est% implcita en el cdigo del controlador. El
siguiente ejemplo demuestra como crear una accin para manejo de formularios@
/ccin para *ane9o de ,or*ularios en
2app2controllers2)lo-7controller.php
=Ip/p
class 7logController e,tends 2ppController A
var Guses H array$?(ost?%C
function add $%
A
if $empty$Gt/is&'data%%
A
Gt/is&'render$%C
D
else
A
if$Gt/is&'(ost&'save$Gt/is&'data%%
A
00o1 genial, datos vlidos
D
else
A
00(eligro, Oill 5oinson. Errores de validacin.
Gt/is&'set$?errorMessage?, ?(or favor corri-a los errores
a continuacin.?%C
Gt/is&'render$%C
D
D
D
D
I'
+a 'ista usada por esta accin puede 'erse as@
6a !ista para el ,or*ulario aKadir en 2app2!ie3s2)lo-2add.tht*l
=/;'26adir post al log=0/;'
=form actionH"=Ip/p ec/o G/tml&'url$?0log0add?%I'" met/odH"post"'
=div classH"log<add"'
=p'@itle:
=Ip/p ec/o G/tml&'input$?(ost0title?,
array$?size?H'?NM?%%I'
=Ip/p ec/o G/tml&'tagErrorMsg$?(ost0title?, @3tulo
re.uerido.?%I'
=0p'
=p'7ody
=Ip/p ec/o G/tml&'te,tarea$?(ost0ody?% I'
=Ip/p ec/o G/tml&'tagErrorMsg$?(ost0ody?, ?Cuerpo del
mensa-e re.uerido.?%I'
=0p'
=p'=IHG/tml&'sumit$?!uardar?%I'=0p'
=0div'
=0form'
El m8todo Controller::validates$GmodelP, Gmodel_Q% es utili3ado para re'isar
cual(uier 'alidacin a la medida agregada en el modelo. El m8todo
Controller::validationErrors$% retorna cual(uier mensaje de error arrojado en el
modelo para (ue puedan ser presentados en la 'ista por tagErrorMsg$%.
0i (uisieras reali3ar alguna 'alidacin a la medida aparte de la 'alidacin de Cake
basada en e&presiones regulares puedes usar la funcin invalidate$% de tu modelo
para marcar campos como errneos. ;magina (ue necesitas mostrar un error en un
formulario cuando un usuario trate de crear un nombre de usuario (ue ya e&ista en el
sistema. /ebido a (ue no puedes solo pedir a Cake (ue encuentre eso usando
e&presiones regulares tu necesitar%s )acer tu propia 'alidacin y marcar el campo
como no '%lido para in'ocar el proceso normal de Cake para formularios no '%lidos.
El controlador podra 'erse as@
=Ip/p
class "sersController e,tends 2ppController
A
function create$%
A
005evisa para ver si los datos del formulario /an sido
enviados
if $>empty$Gt/is&'dataP?"ser?Q%%
A
00Vee si e,iste un usuario con es nomre de usuario.
Guser H Gt/is&'"ser&'find7y"sername$Gt/is&
'dataP?"ser?QP?username?Q%C
00#nvalida el campo para disparar el /elper F@M+ para
mensa-es de error.
if $>empty$GuserP?"ser?QP?username?Q%%
A
Gt/is&'"ser&'invalidate$?username?%C00genera
tagErrorMsg$?"ser0username?%
D
00@rata de guardar normalmente, no deer3a funcionar si el
campo /a sido invalidado.
if$Gt/is&'"ser&'save$Gt/is&'data%%
A
Gt/is&'redirect$?0users0inde,0saved?%C
D
else
A
Gt/is&'render$%C
D
D
D
D
I'
Plu-ins
CakePHP te permite configurar una combinacion de controladores modelos 'istas y
liberarlas como un plugin empa(uetado (ue otros pueden utili3ar en sus aplicaciones
CakePHP. 7ienes un modulo para administracion de usuarios un blog sencillo o un
modulo de ser'icios web en una de tus aplicacionesN Empa(uetala como un plugin
CakePHP para (ue puedas reutili3arla en otras aplicaciones.
0=/0 Crear un Plugin
Como ejemplo de trabajo 'amos a crear un plugin (ue ordene pi33a por ti. Eue podria
ser mas util en cual(uier aplicacion CakePHPN Para empe3ar necesitamos colocar los
arc)i'os del plugin adentro del subdirectorio ?-app-plugins?. El nombre del directorio
padre de todos los arc)i'os del plugin es importante y sera utili3ado en muc)os lugares
asi (ue eligelo sabiamente. Para este plugin usaremos el nombre =pi33a?. *si es como
la configuracion se 'era e'entualmente@
!jemplo 12'1' 3isposicion del sistema de archivos del sistema para ordenar pi%%a'
0app
0plugins
0pizza
0controllers =& +os controladores del plugin
van a.ui
0models =& +os modelos del plugin van a.ui
0vie*s =& +as vistas del plugin van a.ui
0pizza<app<controller.p/p =& 2ppController del
plugin, nomrado despues .ue el plugin
0pizza<app<model.p/p =& 2ppModel del plugin,
nomrado despues .ue el plugin
$o se re(uiere definir un *ppController y un *pp1odel para cual(uier aplicacion pero
si se re(uiere para plugins. $ecesitaras crearlos antes (ue tu plugin trabaje. Estas 9
clases especiales se nombran despues del plugin y e&tienden las aplicaciones padre
*ppController y *pp1odel. *si es como deberian 'erse@
!jemplo 12'4 plugin pi%%a &pp)ontroller'
=Ip/p

class (izza2ppController e,tends 2ppController
A
00...
D

I'
!jemplo 12'2 plugin pi%%a &ppModel'
=Ip/p

class (izza2ppModel e,tends 2ppModel
A
00...
D

I'
0i ol'idas definir estas dos clases especiales CakePHP te en'iara errores de tipo
=1issing Controller? )asta (ue el problema sea rectificado.
%'.& Controladores de Plu-in
+os controladores para nuestro plugin =pi33a? seran guardados en
?-app-plugins-pi%%a-controllers?. ba (ue lo principal sera rastrear las ordenes de pi33a
necesitaremos un #rdersController para este plugin.
+ota
$o se re(uiere pero es recomendable utili3ar nombres unicos para los controladores de
plugins para e'itar conflictos de nombres con aplicaciones padres. $o es e&tra<o pensar
(ue una aplicacion padre pueda tener un .sersController #rderController o
ProductController asi (ue (ui3a necesites ser creati'o con los nombres de tus
controladores o agregar el nombre del plugin al nombre de la clase
(Pi33a#rdersController en este caso).
*si pues colocaremos nuestro Pi33a#rdersControllers en
?-app-plugins-pi%%a-controllers? y se 'era asi@
=Ip/p

class (izzaOrdersController e,tends (izza2ppController
A
var Gname H ?(izzaOrders?C

function inde,$%
A
...
D

function placeOrder$%
A
00...
D
D
I'
$otese como este controlador e&tiende el *ppController del plugin (llamado
Pi33a*ppController) en lugar de el *ppController de la aplicacion.
%'.' Modelos de plu-in
+os modelos para los plugins se guardan en ?-app-plugins-pi%%a-models?. ba )emos
definido un Pi33a#rdersController para este plugin a)ora crearemos el modelo para ese
controlador llamado Pi33a#rders (El nombre de la clase Pi33a#rders es consistente con
nuestro es(uema de nombramiento y es unico asi (ue lo dejaremos como esta).
!jemplo 12'5 -app-plugins-pi%%a-models-pi%%aorder'php
=Ip/p

class (izzaOrder e,tends (izza2ppModel
A
var Gname H ?(izzaOrder?C
D

I'
$ue'amente notese (ue esta clase e&tiende Pi33a*pp1odel en lugar de *pp1odel.
%'.+. Vistas de plu-in
+as 'istas se comportan e&actamente como lo )acen en aplicaciones normales. 0olo
colocalas en el subdirectorio correcto dentro de ?-app-plugins-6plugin7-views?. Para
nuestro plugin =pi33a? necesitaremos cuando menos una 'ista para la accion
Pi33a#rdersController@@inde&() asi (ue incluyamosla tambien@
!jemplo 12'8' -app-plugins-pi%%a-views-pi%%aorders-index'thtml
=/:'Ordena una (izza =0/:'
=p'8ada comina me-or con Ca1e .ue una uena pizza>=0p'
=>&& "n formulario de algun tipo podria ir a.ui... &&'
%'.5. Gra)a9ando con Plu-ins
*)ora (ue )a3 construido todo deberia estar listo para distribuirlo (sugeririamos (ue
tambien distribuyeras algunos e&tras como un readme un arc)i'o s(l etc.).
.na 'e3 (ue un plugin )a sido instalado en ?-app-plugins? puedes accesarlo en la
direccion ?-pluginname-controllername-action?. En nuestro ejemplo de plugin =pi33a?
accesaremos nuestro Pi33a#rdersController en ?-pi%%a-pi%%aOrders?.
*lgunos tips finales para trabajar con plugins en tus aplicaciones CakePHP@
Cuando no tengas un [Plugin\*ppController y un [Plugin\*pp1odel obtendras
errores de tipo =1issing Controller? cuando trates de accesar un controlador de
plugin.
Puedes tener un controlador por default con el nombre de tu plugin. 0i )aces
esto puedes accesarlo 'ia ?-6plugin7-action?. Por ejemplo un plugin llamado
=users? con un controlador llamado =.sersController? puede accesarse en
?-users-add? si no )ay un plugin llamado =*ddController? en tu subdirectorio
?6plugin7-controllers?.
+os plugins usaran los IlayoutsI del subdirectorio por defecto
?GappG'iewsGlayouts?.
Puedes intercomunicar plugins usando en tus controladores@
Gt/is &'re.uest2ction$?0plugin0controller0action?%C
0i utili3as Ire(uest*ction asegurate (ue los nombres del controlador y del
modelo sean unicos. /e otra manera podrias obtener errores de PHP del tipo
=redefined class ^?.
1uc)as gracias a 6eli& >eisendorfer (t)eDundefined) por el material inicial para este
capitulo.
6istas de Control de /cceso
$eccin %
,ntendiendo como tra)a-a AC1
+o mas importante las cosas potentes re(uieren algAn tipo de control de acceso. +as
listas de control de acceso son una forma de gestionar los permisos de las aplicaciones
de una manera muy detallada f%cilmente mantenida y manejable. +as listas de control
de acceso o *C+ (*ccess Control +ist) se encargan principalmente de dos cosas@ cosas
(ue (uieren mas algo y cosas (ue son necesitadas. En argot de *C+ las cosas
(mayormente usuarios) (ue (uieren usar algo son llamadas objetos de peticin de
acceso o *"#s (*ccess "e(uest #bject). +as cosas en el sistema (ue son necesitadas
(mayormente acciones o datos) son llamadas objetos de control de acceso *C#s
(*ccess Control #bjects). +as entidades son llamadas IobjetosI por(ue algunas 'eces el
objeto (ue )ace la peticin no es una persona ! algunas 'eces puede (ue se (uiera
limitar el acceso (ue tienen ciertos controladores de Cake y se tenga (ue iniciar la
lgica en otras partes de tu aplicacin. +os *C#s pueden ser cual(uier cosa (ue se
(uiera controlar desde una accin de controlador un ser'icio web )asta una lnea en el
dario en linea de la abuela.
Para usar todos los acrnimos de una 'e3@ *C+ es usado para decidir cuando un *"#
puede tener acceso a un *C#.
*)ora para entender esto 'amos a reali3ar un ejemplo pr%ctico. ;magine por un
momento (ue un sistema de computadora es usado por un grupo de a'entureros. El
lder del grupo (uiere seguir adelante en su a'entura mientras mantiene un cantidad
saludable de pri'acidad y seguridad para los otros miembros del grupo. +os *"#s
in'olucrados son los siguientes@
!andalf
2ragorn
7ilo
Brodo
!ollum
+egolas
!imli
(ippin
Merry
Estas son las entidades en el sistema (ue estar%n )aciendo peticiones (los *C#s) desde
el sistema. 0e debe de entender (ue *C+ no es un sistema encargado de autentificar a
los usuarios. ba se debe de contar con alguna manera de almacenar la informacin del
usuario y ser cap%3 de 'erificar la identidad del usuario cuando estos intentan acceder al
sistema. .na 'e3 (ue se sabe (uien es el usuario es cuando *C+ empie3a a brillar
realmente. /e regreso a nuestra a'entura.
+a siguiente cosa (ue >andalf necesita reali3ar es )acer un lista inicial de cosas o
*C#s (ue el sistema manejar%. 0u lista parecer% a algo como esto@
2rmas
El anillo
(uerco )alado
4iplomacia
Cerveza
7radicionalmente los sistemas eran manejados usando una clase de matri3 (ue
mostraba una coleccin b%sica de usuarios y permisos relacionados con objetos. 0i esta
informacin fuese almacenada en una tabla se 'era de la siguiente manera con las 5
indicando acceso denegado y las # indicando permiso permitido.
/r*as El anillo Puerco $alado iplo*acia Cer!e0a
Handal, 5 5 # # #
/ra-orn # 5 # # #
Bil)o 5 5 5 5 #
:rodo 5 # 5 5 #
Hollu* 5 5 # 5 5
6e-olas # 5 # # #
Hi*li # 5 # 5 5
Pippin 5 5 5 # #
Merr< 5 5 5 5 #
* primera 'ista parece (ue este sistema puede funcionar bastante bien. El trabajo puede
)acerse para proteger la seguridad (solamente 6rodo puede acceder al anillo) y
protegerse contra accidentes (dejando alejados a los )obbits del puerco salado). Parece
ser lo suficientemente detallado y f%cil de leer TciertoN.
Para un sistema pe(ue<o como este tal 'e3 una configuracin de matri3 puede
funcionar. Pero para un sistema en crecimiento o un sistema con un gran nAmero de
recursos (*C#s) y usuarios (*"#s) una tabla puede con'ertirse difcil de manejar de
una manera bastantemente r%pida. ;magine intentar controlar el acceso a los cientos de
campamentos de guerra e intentar manejarlos por unidad por ejemplo. #tra des'entaja
de las matrices es (ue no se puede agrupar secciones de usuarios de una manera lgica
o )acer cambio de permisos en cascada a grupos de usuarios basados en esas
agrupaciones lgicas. Por ejemplo sera bueno (ue autom%ticamente se le permitiera el
acceso a los )obbits a la cer'e3a y al puerco una 'e3 (ue la batalla )a terminado@
Hacerlo de manera indi'idual por cada usuario sera tedioso y un error 'ergon3oso
mientras (ue )acer el cambio de permisos en cascada a todos los I)obbitsI sera
realmente f%cil.
*C+ es frecuentemente implementado en una estructura de %rbol. E&iste normalmente
un %rbol de *"#s y un %rbol de *C#s. #rgani3ando los objetos en %rboles los
permisos se pueden seguir manejando de modo detallado mientras se mantiene una
buena compostura en la idea principal. 0iendo el lder sabio >andalf elige usar *C+ en
su nue'o sistema y organi3a sus objetos a lo largo de las siguientes lineas@
Comunidad del 2nillo:
!uerreros
2ragorn
+egolas
!imli
Magos
!andalf
Foits
Brodo
7ilo
Merry
(ippin
Visitantes
!ollum
Estructurando nuestro grupo de esta manera podemos definir control de accesos en el
%rbol y aplicar esos permisos en cual(uier )ijo. El permiso por defecto es pro)ibir el
acceso a todo. 1ientras trabaje )acia abajo en el %rbol elegir% permisos y los aplicar%.
El Altimo permiso aplicado ((ue aplica al *C# (ue se est% imaginando) es el (ue usted
guarda. Entonces usando nuestro %rbol de *"#s >andalf da algunos permisos@
Comunidad del 2nillo: P(ro/iir: @O4OQ
!uerreros P(ermitir: 2rmas, Cerveza, Once
racionesQ
2ragorn
+egolas
!imli
Magos P(ermitir: (uerco )alado,
4iplomacia, CervezaQ
!andalf
Foits P(ermitir: CervezaQ
Brodo
7ilo
Merry
(ippin
Visitantes P(ermitir: (uerco )aladoQ
!ollum
0i (uisi8ramos usar *C+ para 'er si Pippin tiene permitido acceder a la cer'e3a
primero obtendramos su direccin en el %rbol (ue es ComunidadXHobbitsXPippin.
Entonces 'eramos los diferentes permisos (ue residen en cada uno de esos puntos y
usaramos el permiso m%s especfico relacionado con Pippin y la Cer'e3a.
Comunidad O P"#H;F;" Cer'e3a entonces pro)ibir (por (ue est% establecido
pro)ibir todos los *C#s).
Hobbits O Permitir Cer'e3a entonces permitir.
Pippin O NY $o e&iste ninguna informacin especfica con la cer'e3a entonces
nos (uedamos con PE"1;7;".
"esultado 6inal@ permitir la cer'e3a.
El %rbol tambi8n nos permite )acer ajustes m%s pe(ue<os para tener un control detallado
O mientras se cuente con la )abilidad de )acer cambios generali3ados a los grupos de
*"#s@
Comunidad del 2nillo: P(ro/iir: @O4OQ
!uerreros P(ermitir: 2rmas, Cerveza, Once
racionesQ
2ragorn P(ermitir: 4iplomaciaQ
+egolas
!imli
Magos P(ermitir: (uerco )alado,
4iplomacia, CervezaQ
!andalf
Foits P(ermitir: CervezaQ
Brodo P(ermitir: 2nilloQ
7ilo
Merry P(ro/iir: CervezaQ
(ippin P(ermitir: 4iplomaciaQ
Visitantes P(ermitir: (uerco )aladoQ
!ollum
0e puede 'er esto por(ue el *"# de *ragorn mantiene su permiso tal como los dem%s
en el *"# del grupo de >uerreros pero aAn se puede reali3ar ajustes detallados y casos
especiales cuando se ocupen. #tra 'e3 el permiso por defecto es P"#H;F;" y el Anico
cambio mientras se baja en el %rbol nos obliga a PE"1;7;". Para 'er si 1erry puede
acceder a la Cer'e3a obtendramos su ruta en el %rbol@ ComunidadXHobbitsX1erry y
a trabajar de manera descendente manteniendo el rastro de permisos relacionados con
la cer'e3a.
Comunidad O P"#H;F;" (por (ue est% establecido pro)ibir todo) entonces se
pro)be la cer'e3a
Hobbits O PE"1;7;"@ Cer'e3a entonces se permite la cer'e3a.
1erry O P"#H;F;" cer'e3a entonces se pro)be la cer'e3a.
"esultado 6inal@ se pro)be la cer'e3a.
$eccin &
>efiniendo permisos? AC1 de Cake )asado en I+I
+a primera implementacin de *C+ en Cake estu'o basada en arc)i'os ;$;
almacenados en la instalacin de Cake. 1ientras (ue sea usable y estable
recomendamos (ue utilice la solucin secundaria de base de datos mayormente por su
)abilidad para crear nue'os *C#s y *"#s al 'uelo. $os referimos a su utili3acin e
aplicaciones simples ! y especialmente para a(uellas personas (ue no est8n utili3ando
una base de datos por alguna ra3n.
+os permisos de *"#G*C# son especificados en 2app2con,i-2acl.ini.php. +as
instrucciones especificando el acceso pueden ser encontradas al inicio de acl.ini.p)p@
C acl.ini.p/p & Ca1e 2C+ Configuration
C
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
C "se este arc/ivo para especificar los permisos de usuario.
C aco H o-eto de control de acceso $access control o-ect% $algo en
tu aplicacin%
C aro H o-eto de peticin de acceso $access re.uest o-ect% $algo
pidiendo acceso%
C
C +os registros de "suario son agregados de la siguiente manera:
C
C PuidQ
C groups H grupo:, grupo;, grupoL
C allo* H aco:, aco;, acoL
C deny H acoN, acoT, acoK
C
C +os 5egistros de !rupo son agregados de una manera similar:
C
C PgidQ
C allo* H aco:, aco;, acoL
C deny H acoN, acoT, acoK
C
C +as secciones de allo*, deny y groups $permitir, pro/iir y grupos%
son todas opcionales.
C 8O@2: +os nomres de grupos `no pueden` ser nunca los mismos .ue los
nomres de usuarios>
0i se utili3a el arc)i'o ;$; se puede especificar usuarios (*"#s) el (los) grupo(s) a los
(ue pertenecen y sus propios permisos. 7ambi8n puede especificar grupos junto con sus
permisos. Para aprender como utili3ar el componente *C+ de Cake para 'erificar los
permisos utili3ando este arc)i'o ;$; 'ea la seccin CC.,.
$eccin '
>efniendo permisos? !ase de datos AC1 de Cake
Co*en0ando
+a implementacin est%ndar de permisos *C+ se almacena en base de datos. +a Fase
de /atos *C+ o db*C+ consiste en una conjunto de nAcleo de modelos y un script de
lnea de comandos (ue 'iene con su instalacin de Cake. +os modelos (ue son
utili3ados por Cake para interactuar con su base de datos con el fin de almacenar y
obtener los nodos del %rbol *C+. El script de lnea de comandos es utili3ado para
ayudarle a iniciar y permitirle interactuar con sus %rboles.
Para iniciar primero debe de asegurarse (ue 2app2con,i-2data)ase.php est% presente y
correctamente configurado. Para una nue'a instalacin de Cake la manera m%s f%cil de
darse cuenta de esto es poniendo el directorio de instalacin en un na'egador web.
Cerca de la parte superior de la p%gina debe de 'er el siguiente mensaje =bour database
configuration file is present.? (=El arc)i'o de configuracin de su base de datos est%
presente?) y =Cake is able to connect to t)e database? (=Cake )a podido conectarse a su
base de datos?) si se )a )ec)o correctamente. 2ea la seccin ,.C para mas informacin
de la configuracin de su base de datos.
/espu8s utilice el script de lnea de comandos de *C+ para iniciali3ar su base de datos
y almacenar la informacin *C+. El script locali3ado en GcakeGscriptsGaclp)p le ayudar%
a lograr esto. ;nicialice su base de datos para *C+ ejecutando el siguiente comando
(desde su directorio 2cake2scripts)@
Iniciali0ando su )ase de datos usando acl.php
G p/p acl.p/p initd
#nitializing 4ataase... $#nicializando ase de datos%
Creating access control o-ects tale $acos%... $Creando tala
de o-etos de control de acceso%
Creating access re.uest o-ects tale $acos%... $Creando tala
de o-etos de peticin de acceso%
Creating relations/ips tale $aros<acos%... $Creando tala de
relaciones%
4one. $Fec/o%
En este punto debe de ser cap%3 de 'erificar la base de datos de su proyecto y 'er las
nue'as tablas. 0i es lo suficientemente curioso acerca de como Cake almacena el %rbol
de informacin en esas tablas lea y entienda la base de datos modificada 'isitando cada
nodo del %rbol. +as tablas de acos y aros almacenan los nodos de sus respecti'os
%rboles y la tabla arosDacos es usada para 'incular sus *"#s a los *C#s (ue pueden
acceder.
*)ora debe de ser capa3 de comen3ar a crear sus %rboles de *"#s y *C#s.
Creando o)9etos de peticin de acceso "/;(s# < o)9etos de control de
acceso "/C(s#
E&isten dos maneras de referirse a los *"#sG*C#s. .na es d%ndoles un id nAmerico
(ue es usualmente la lla'e primaria de la tabla a la (ue pertenecen. b la otra manera es
d%ndoles una cadena alias. +as dos no son e&clusi'as mutuamente.
+a manera de crear un nue'o *"# es utili3ando los m8todos definidos en el modelo de
Cake *ro. El m8todo create() de la clase *ro toma tres par%metros@ SlinkDid
SparentDid y Salias. Uste m8todo crea un nue'o objeto *C+ bajo el padre especificado
por parentDid ! como objeto ra3 si SparentDid es nulo. +a 'ariable SlinkDid le permite
enla3ar un objeto de usuario actual a las estructuras *C+ de Cake. El par%metro alias le
permite darle una direccin a su objeto sin utili3ar un ;/ entero.
*ntes de (ue podamos crear nuestros *C#s y *"#s necesitaremos cargar esas clases.
+a manera m%s f%cil de )acer esto es incluir el Componente *C+ de Cake en su
controlador utili3ando el arreglo Scomponents@
var Gcomponents H array$?2cl?%C
.na 'e3 (ue )ayamos reali3ado esto 'eamos algunos ejemplos de como se 'era crear
estos objetos. El cdigo siguiente puede ser colocado en cual(uier parte de una accin
de un controlador@
Garo H ne* 2ro$%C

00(rimero, configuramos unos cuantos 25Os
00Estos o-etos no tendrn ning9n padre inicialmente.

Garo&'create$ :, null, ?7o Marley? %C
Garo&'create$ ;, null, ?Ximi Fendri,?%C
Garo&'create$ L, null, ?!eorge Oas/ington?%C
Garo&'create$ N, null, ?2ra/am +incoln?%C

00 2/ora, podemos /acer grupos para organizar esos usuarios:
00 8ote .ue los #4s para estos o-etos es M, por.ue
00 nunca estarn atados a usuarios en nuestro sistema.

Garo&'create$M, null, ?(residentes?%C
Garo&'create$M, null, ?2rtistas?%C

00 2/ora, "enganc/emos" los 25Os a sus respectivos grupos
Garo&'set(arent$?(residentes?, ?!eorge Oas/ington?%C
Garo&'set(arent$?(residentes?, ?2ra/am +incoln?%C
Garo&'set(arent$?2rtistas?, ?Ximi Fendri,?%C
Garo&'set(arent$?2rtistas?, ?7o Marley?%C

00 En pocas l3neas, esta es la manera en .ue se utiliza
Garo H ne* 2ro$%C
Garo&'create$Guser<id, Gparent<id, Galias%C
El comando correspondiente del script en la linea de comandos sera@ Sacl.p)p create
aco WlinkDidV WparentDidV WaliasV.
/si-nando per*isos
/espu8s de crear nuestros *C#s y *"#s podemos finalmente asignar permisos entre
los dos grupos. Esto se )ace utili3ando el componente *cl del nAcleo de Cake.
Continuemos con nuestro ejemplo@
00 (rimero, en un controlador, necesitaremos acceso
00 al componente 2C+ de Ca1e.

class 2lgunControlador e,tends 2ppControler
A
00 @al vez le gustar3a colocar esto en el 2ppController
00 en lugar de a.u3, pero tamiJn a.u3 funciona ien.

var Gcomponents H array$?2cl?%C

00 5ecuerde: 2C+ siempre pro/iir algo acerca
00 de lo .ue no tiene informacin. )i alguna
00 verificacin fue /ec/a en algo, ser pro/iida.
00 (ermitamos .ue un 25O pueda acceder a un 2CO.

function alguna2ccion$%
A
00 (E5M#@#5

00 2.u3 est como se concede a un 25O acceso
00 completo a un 2CO
Gt/is&'2cl&'allo*$?Ximi Fendri,?, ?!uitarra
ElJctrica?%C
Gt/is&'2cl&'allo*$?7o Marley?, ?!uitarra
ElJctrica?%C

00 @amiJn podemos asignar permisos a grupos,
arecuerdaI
Gt/is&'2cl&'2llo*$?(residentes?, ?E-Jrcito de
los Estados "nidos?%C

00 El mJtodo allo*$% tiene un tercer parmetro,
Gaccion.
00 (uede especificar acceso parcial usando este
paremtro.
00 Gaccion puede estalecerce a create, read,
update o delete
00 $crear, leer, actualizar o orrar%
00 )i no se especifica una accin, se asume
acceso total.

00 Vea, no to.ue, sea caallero:
Gt/is&'2cl&'allo*$?!eorge Oas/ington?,
?!uitarra Electrica?, ?read?%C
Gt/is&'2cl&'allo*$?2ra/am +incoln?,
?!uitarra Electrica?, ?read?%C

00 (5OF#7#5

00 El traa-o se pro/3e de la misma manera:

00 Cuando se termine su mandato...
Gt/is&'2cl&'deny$?2ra/am +incoln?, ?E-Jrcito
de los Estados "nidos?%C
D
D
Este controlador en especfico no es Atil pero su objeti'o es mayormente mostrarle
como funciona el proceso. .tili3ar el componente *cl en cone&in con su controlador
manejador de usuarios sera la mejor utili3acin. .na 'e3 (ue un usuario )a sido creado
en el sistema su *"# puede ser creado y colocado en la posicin correcta del %rbol y
los permisos pueden ser asignados a un *C# especfico o grupo de *C#s basados en su
identidad.
+os permisos tambi8n pueden ser asignados utili3ando el script de lnea de comandos
empacado junto a Cake. +a sinta&is es similar al funcionamiento del modelo y puede
ser 'isto ejecutando S p)p acl.p)p )elp.
$eccin +
(erificando permisos ? ,l componente AC1
+a 'erificacin de permisos es la parte m%s f%cil de utili3ar el *C+ de Cake@ consiste en
utili3ar un Anico m8todo del componente *cl@ c)eck(). .na buena manera de
implementar *C+ en su aplicacin podra ser el colocar una accin en su *ppController
(ue realice una 'erificacin de *C+. .na 'e3 colocado a) puede acceder al
componente *cl y reali3ar 'erificacin de permisos a tra'8s de toda la aplicacin. *(u
est% un ejemplo de implementacin@
class 2ppController e,tends Controller
A
00Otenemos nuestro componente
var Gcomponents H array$?2cl?%C
00verifica2cceso $Gaco%
function c/ec12ccess$Gaco%
A
00
Gacceso H Gt/is&'2cl&'c/ec1$Gt/is&)ession&
'read$?alias<usuario?%, Gaco, Gaccion H"`"%C
002cceso pro/iido
if $Gacceso HH false%
A
ec/o "2cceso (ro/iido"
e,itC
D
002cceso permitido
else
A
ec/o "2cceso (ermitido"C
e,itC
D
D
D
F%sicamente al )aber puesto el componente *cl disponible en nuestro *ppController
estar% 'isible para utili3arse en cual(uier controlador de su aplicacin.
00bste es el formato sico:
Gt/is&'2cl&'c/ec1$Garo, Gaco, Gaction H ?`?%C
$anea*iento de datos
%5.% >sando $aniti0e en tu aplicacion.
Cake 'iene con 0aniti3e una clase (ue puedes utili3ar para eliminar datos maliciosos
en'iados por el usuario u otros datos no re(ueridos. 0aniti3e es una libreria del nucleo y
puede ser utili3ada en cual(uier lugar dentro de tu codigo pero es probablemente mejor
usada en controladores y modelos.
00 (rimero, incluir la lireria:
uses $?sanitize?%C
00 )iguiente, crear un nuevo o-eto sanitize:
GmrClean H ne* )anitize$%C

00 2 partir de a.ui, puedes usar )anitize para limpiar los datos
00 $+os metodos se e,plican en la siguiente seccion%
%5.& Haciendo los datos se-uros para usarlo en $Q6 <
HGM6
Esta seccion e&plica como utili3ar algunas de las funciones (ue 0aniti3e ofrece.
paranoid $Gstring, Gallo*edC/ars%C
string GstringC
array Gallo*edC/arsC
Esta funcion e&trae cual(uier cosa (ue no sea un simple caracter alfanumerico de la
cadena Sstring. Puedes sin embargo dejarlo pasar ciertos caracteres indicandolos
dentro del arreglo Sallowed.
Gad)tring H "C:=script'=/tml'= 00 'ccd"C
ec/o GmrClean&'paranoid$Gad)tring%C

00output: script/tml

ec/o GmrClean&'paranoid$Gad)tring, array$? ?, ?c?%%C

00output: script/tml cc
/tml $Gstring, Gremove H false%C

string GstringC
oolean Gremove H falseC
Este metodo te ayuda a obtener datos en'iados por el usuario listos para mostrarlos
dentro del H71+. Esto es especialmente util si no (uieres (ue los usuarios puedan
romper tus IlayoutsI o insertar imagenes o scripts dentro de los comentarios de un blog
post de un foro y similares. 0i la opcion Sremo'e se establece en 'erdadero (true)
cual(uier codigo H71+ sera remo'ido en lugar de ser procesado como codigo H71+.
Gad)tring H ?=font sizeH"ZZ"
colorH"dBBMMMM"'FER=0font'=script'...=0script'?C

ec/o GmrClean&'/tml$Gad)tring%C

00output: GltCfont sizeH].uotCZZ].uotC
colorH].uotCdBBMMM].uotC]gtCFER]ltC0font]gtC]ltCscript]gtC...]ltC0scri
pt]gtC

ec/o GmrClean&'/tml$Gad)tring, true%C

00output: font sizeHZZ colorHdBBMMMM FER fontscript...script
s.l $Gstring%C

string GstringC
0e utili3a para librar declaraciones 0E+ a<adiendo diagonales dependiendo de la
configuracion de ImagicD(uotesDgpcI del sistema.
clean2rray $Gdirty2rray%C

array cGdirty2rrayC
Esta funcion es de tipo industrial limpiador multiproposito creada para ser usada en
arreglos enteros (como St)isXparams[IformI\ por ejemplo). +a funcion toma un arreglo
y lo limpia@ no se regresa ningun 'alor ya (ue el arreglo se pasa como referencia. +as
siguientes operaciones de limpie3a son reali3adas en cada elemento del arreglo
(recursi'amente)@
Espacios impares (incluyendo :&C*) son reempla3ados por espacios regulares.
El codigo H71+ es reempla3ado por su entidad H71+ correspondiente (desde
cn )asta WbrV).
0e )ace un doble c)e(ueo de caracteres especiales y se eliminan retornos de
carro para incrementar la seguridad 0E+.
0e a<aden diagonales para 0E+ (solo llamadas a la funcion 0E+ descrita
anteriormente).
0e intercambian las diagonales in'ertidas ingresadas por el usuario con
diagonales in'ertidas de confian3a.
El Co*ponente de $esin
$eccin %
@pciones de Auardado en Sesin para Cake
Cake 'iene predefinido para guardar los datos de sesin de B maneras@ como arc)i'os
temporales dentro de la instalacin de Cake usando el mecanismo por default de PHP
o seriali3ando en una base de datos. Cake utili3a la configuracin por defecto de PHP.
Para cambiar esa configuracin y poder usar los arc)i'os temporales o la base de datos
edita tu arc)i'o de configuracin core ubicado en 2app2con,i-2core.php. Cambia la
constante C*HED0E00;#$D0*2E a IcakeI Ip)pI o IdatabaseI dependiendo en las
necesidades de tu aplicacin.
Configuracin de Sesin en core/php
0``
` Ca1e(F( includes L types of session saves
` dataase or file. )et t/is to your preferred met/od.
` #f you *ant to use your o*n save /andler place it in
` app0config0name.p/p 4O 8O@ ")E file or dataase as t/e name.
` and use -ust t/e name portion elo*.
`
` )etting t/is to ca1e *ill save files to 0ca1edistro0tmp directory
` )etting it to p/p *ill use t/e p/p default save pat/
` )etting it to dataase *ill use t/e dataase
`
`
`0
define$?C2EE<)E))#O8<)2VE?, ?p/p?%C
Para guardar los datos de sesin en la base de datos necesitas crear una tabla en tu base
de datos. El dise<o para esa tabla se puede encontrar en 2app2con,i-2sql2sessions.sql.
$eccin &
3sando el componente de Sesin de Cake
El componente de sesin de Cake es usado para interactuar con la informacin de
sesin. ;ncluye funciones b%sicas de lectura y escritura pero tambi8n contiene
caractersticas para el uso de sesiones para mensajes de error y de recibido (por ej. =7us
datos )an sido guardados?). El componente de sesin esta disponible en todos los
controladores de Cake por defecto.
*(ui )ay algunas de las funciones (ue mas utili3aras@
c)eck
string Sname
"e'isa si la lla'e actual especificada por Sname )a sido en'iada en la sesin.
del
string Sname
delete
string Sname
Forra la 'ariable de sesin especificada por Sname.
error
"egresa el Altimo error creado por el componente Cake0ession. ComAnmente usado
para debugging.
flas)
string Skey O Iflas)I
"egresa el Altimo mensaje establecido en la sesin usando set6las)(). 0i Skey )a sido
establecida el mensaje regresado es el mas recientemente guardado en esa lla'e.
read
string Sname
"egresa la 'ariable de sesin especificada por Sname.
renew
"enue'a la sesin actualmente acti'a creando un nue'o ;/ de sesin borrando la
antigua y pasando la 'ieja informacin de sesin a la nue'a.
set6las)
string Sflas)1essage
string Slayout O IdefaultI
array Sparams
string Skey O Iflas)I
Escribe el mensaje especificado por Sflas)1essage en la sesin (para ser despu8s
recuperada por flas)()).
0i Slayout esta establecido como IdefaultI el mensaje es guardado como IWdi'
classO=message?VI.Sflas)1essage.IWGdi'VI. 0i Sdefault esta establecido como II el
mensaje es guardado solo como )a sido pasado. 0i otro 'alior es pasado el mensaje es
guardado dentro de la 'ista de Cake especificada por Slayout.
Han sido colocados parametros en esta funcin para uso en un futuro. "e'isa esto en un
futuro para mas informacin.
+a 'ariable Skey te permite guardar mensajes flas) en las lla'es. "e'isa la
documentacin de flas)() para obtener un mensaje basado en una lla'e.
'alid
"egresa true si la sesin es 'alida. Es mejor usado antes de operaciones read() para
asegurarse (ue la informacin de sesin (ue esta tratando de accesar es 'alida.
write
string Sname
mi&ed S'alue
Escribe la 'ariable especificada por Sname y S'alu en la sesin acti'a.
El Co*ponente ;equest Handler
$eccin %
Introduccin
El componente "e(uest Handler es usado en Cake para determinar la forma en la cual la
informacin llega en la peticin H77P. Puede usarse para informar mejor al controlador
sobre peticiones *4*5 obtiene informacin sobre la direccin ;P del cliente remoto y
el tipo de peticin o saca datos indeseados de la salida. Para usar el componente
"e(uest Handler ser% necesario especificarlo en el array Scomponents del controlador.
class @/ingsController e,tends 2ppController
A
var Gcomponents H array$?5e.uestFandler?%C
00 ...
D
$eccin &
@teniendo informacin Client<Request
2amos a entrar en materia@
accepts
o string Stype
/e'uel'e informacin sobre el tipo de contenido (ue el client acepta dependiendo del
'alor de Stype. 0i es null o no se pasa un 'alor de'ol'er% un array de los tipos de
contenido (ue el cliente acepta. 0i se pasa una cadena de'ol'er% 'erdadero si el cliente
acepta el tipo dado c)e(ueando Stype contra el mapa de tipo!contenido ('er
setContent()). 0i Stype es un array cada cadena es e'aluada indi'idualmente y
accepts() de'ol'er% true si alguno de ellos encaja con un tipo de contenido aceptado.
Por ejemplo@
class (ostsController e,tends 2ppController
A
var Gcomponents H array$?5e.uestFandler?%C
function eforeBilter $%
A
if $Gt/is&'5e.uestFandler&'accepts$?/tml?%%
A
00 E-ecuta solo el cdigo si el cliente acepta una
respuesta F@M+ $te,t0/tml%
D
elseif $Gt/is&'5e.uestFandler&'accepts$?rss?%%
A
00 E-ecuta solo cdigo 5))
D
elseif $Gt/is&'5e.uestFandler&'accepts$?atom?%%
A
00 E-ecuta solo cdigo 2tom
D
elseif $Gt/is&'5e.uestFandler&'accepts$?,ml?%%
A
00 E-ecuta solo cdigo YM+
D
if $Gt/is&'5e.uestFandler&'accepts$array$?,ml?, ?rss?,
?atom?%%%
A
00 E-ecuta si el cliente acepta alguno de los siguientes:
YM+, 5)) o 2tom
D
D
D
get*ja&2ersion
0i se esta usando una librera 40 Prototype tu puedes obtener un )eader especial para
asignar a las peticiones *4*5 . Esta funcin de'uel'e la 'ersin utili3ada de Prototype.
getClient;P
/e'uel'e la direccin ;P del cliente remoto.
get"eferrer
/e'uel'e el nombre del ser'idor desde el cual la peticin )a sido originada.
is*ja&
/e'uel'e true si la actual peticin fue un 51+Http"e(uest.
is*tom
/e'uel'e true si el cliente acepta contenido *tom feed (applicationGatomd&ml).
is/elete
/e'uel'e true si la actual peticin fue 'a /E+E7E.
is>et
/e'uel'e true si la actual peticion fue 'a >E7.
is1obile
/e'uel'e true si la cadena user agent concuerda con un na'egador web mobile.
isPost
/e'uel'e true si la actual peticin fue 'a P#07.
isPut
/e'uel'e true si la actual peticin fue 'a P.7.
is"ss
/e'uel'e true si los clientes aceptan contenido "00 feed (applicationGrssd&ml).
is5ml
/e'uel'e true si el cliente acepta contenido 51+ (applicationG&ml or te&tG&ml).
setContent
string Sname
string Stype
*<ade un alias de tipo de contenido al mapa para (ue sea usado con accepts() y
prefers() donde Sname el el nombre de el mapping (string) y Stype es una cadena
cual(uiera o un array de cadenas cada uno de las cuales es un tipo 1;1E. +a
incorporacin de mapas de tipos es como se muestra a continuacin@
00 8ame H' @ype
?-s? H' ?te,t0-avascript?,
?css? H' ?te,t0css?,
?/tml? H' ?te,t0/tml?,
?form? H' ?application0,&***&form&urlencoded?,
?file? H' ?multipart0form&data?,
?,/tml? H' array$?application0,/tmlU,ml?, ?application0,/tml?,
?te,t0,/tml?%,
?,ml? H' array$?application0,ml?, ?te,t0,ml?%,
?rss? H' ?application0rssU,ml?,
?atom? H' ?application0atomU,ml?
$eccin '
Stripping >ata
#casionalmente se podra (uerer borrar datos desde un peticin o salida. .se las
siguientes funciones de "e(uest Handler para reali3ar estos tipos de operaciones.
strip*ll
o string Sstr
0aca espacios en blanco im%genes y scripts de Sstr (usando strip])itespace()
strip;mages() y strip0cripts()).
strip;mages
o string Sstr
0aca cual(uier im%gen embebida en el )tml de Sstr.
strip0cripts
o string Sstr
0aca cual(uier eti(ueta WscriptV y WstyleV de Sstr.
strip7ags
o string Sstr
o string StagC
o string Stag9^
Forra las eti(uetas especificadas por StagC Stag9 etc. de Sstr.
Gsome)tring H ?=font colorH^^"dBBMMMM^^"'=old'Boo=0old'=0font'
=em'7ar=0em'?C
ec/o Gt/is&'5e.uestFandler&'strip@ags$Gsome)tring, ?font?, ?old?%C
00 )alida: Boo =em'7ar=0em'
strip])ite0pace
o string Sstr
0aca espacios en blanco de Sstr.
$eccin +
@tras Btiles funciones
El componente "e(uest Handler es especialmente Atil cuando una aplicacin incluye
peticiones *4*5. +a funcin set*ja& se usa para detectar autom%ticamente peticiones
*4*5 y asignar al layout del controlador un *4*5 layout para la peticin. El beneficio
es (ue se pueden )acer pe(ue<as 'istas modulares (ue pueden tambi8n ser dobles con la
'ista *4*5.
00 list.t/tml
=ul'
=I foreac/ $Gt/ings as Gt/ing%:I'
=li'=Ip/p ec/o Gt/ingCI'=0li'
=Iendforeac/CI'
=0ul'
00&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
00+a accion list en @/ingsController:
function list$%
A
Gt/is&'5e.uestFandler&'set2-a,$Gt/is%C
Gt/is&'set$?t/ings?, Gt/is&'@/ing&'find2ll$%%C
D
Cuando una peticin de un na'egador normal se )ace a Gt)ingsGlist la lista desordenada
es renderi3ada dentro del layout por defecto de la aplicacin. 0i la ."+ es peticionada
como parte de una operacin *4*5 la lista es autom%ticamente renderi3ada en el 'aco
*4*5 layout.
El co*ponente de $e-uridad
$eccin %
Introduccin
El componente de seguridad es usado para proteger las acciones de su controlador en
contra de peticiones malignas o errneas. 7e permite configurar las condiciones bajo las
cuales una accin puede ser llamada y opcionalmente especifica como tratar con
peticiones (ue no cumplen con esos re(uisitos. *ntes de usar el componente de
seguridad debe de asegurarse (ue I0ecurityI este listado en el arreglo Scomponents de
su controlador.
$eccin &
Protegiendo las acciones del controlador
El componente de seguridad contiene 9 m8todos primarios para restringir acceso a
acciones del controlador@
re(uirePost
string SaccionC
string Saccion9
string SaccionB^
Para (ue las acciones se puedan ejecutar deben de ser llamadas por medio de P#07.
re(uire*ut)
string SaccionC
string Saccion9
string SaccionB^
0e asegura (ue una peticin pro'iene de la misma aplicacin 'erificando con una lla'e
de autenticacin (ue se encuentra en la informacin guardada en P#07 del formulario
contra una lla'e de autenticacin guardada en la sesin del usuario. 0i coinciden la
accin es llamada para ejecucin. 0in embargo tenga cuidado (ue por ra3ones de
fle&ibilidad esta 'alidacin solo se )ace si la informacin de un formulario ya )a sido
en'iada. 0i la accin es llamada con una peticin por medio de >E7 re(uire*ut)() no
)ara nada. Para m%&ima seguridad debera de usar re(uirePost() y re(uire*ut)() en
acciones (ue desea completamente protegidas. *prenda mas acerca de como la lla'e de
autenticacin es generada y como termina donde debera en la seccin , de mas abajo.
Pero primero 'eamos un ejemplo simple@
class @/ingsController e,tends 2ppController
A
var Gcomponents H array$?)ecurity?%C

function eforeBilter$%
A
Gt/is&')ecurity&'re.uire(ost$?delete?%C
D

function delete$Gid%
A
00 Esto solo ocurriria si la accion es llamada por medio de
una peticion F@@( (O)@
Gt/is&'@/ing&'del$Gid%C
D
D
*(ui estamos diciendo al componente de seguridad (ue la accin IdeleteI re(uiere una
peticin P#07. El m8todo before6ilter() es usualmente donde usted (uiere dice al
componente de seguridad (y a casi todos los componentes) (ue )acer. /espu8s ira a
)acer lo (ue se le indica despu8s de (ue el m8todo before6ilter() es llamado pero justo
antes de (ue la accin misma sea ejecutada.
Eso es todo lo (ue )ay (ue )acer. +o puede probar escribiendo la ."+ de la accin en
su na'egador y 'iendo (ue es lo (ue sucede.
$eccin '
%ane-o de peticiones inv*lidas
0i una peticin no cumple con los re(uisitos de seguridad (ue )emos definido T(ue
pasa con ellaN por defecto a la peticin se le manda una cabecera con cdigo ,:, (se le
llama IFlack!HoleI) y la aplicacin de inmediato termina. 0in embargo el componente
de seguridad tiene una propiedad SblackHoleCallback la (ue puede configurar con el
nombre de una funcin personali3ada definida en su controlador.
En lugar de simplemente en'iar una cabecera ,:, y no )acer nada esta propiedad le
permite reali3ar algunas 'alidaciones adicionales a la peticin direccionar la peticin a
otra ubicacin o )asta registrar la direccin ;P del cliente. 0in embargo su elije un
callback personali3ado es su responsabilidad el terminar la aplicacin si la peticin es
in'%lida. 0i su callback regresa el 'alor booleano ItrueI entonces el componente de
seguridad continuara para 'alidar la peticin contra otros re(uerimientos (ue tenga
definidos. /e otra manera detiene la 'alidacin y su aplicacin continua sin ser
molestada.
$eccin +
Autenticaciones avanCadas a las peticiones
El m8todo re(uire*ut)() le permite ser muy detallado al especificar como y de donde la
accin puede ser accesada pero 'iene con ciertas estipulaciones de uso las cuales se
aclararan cuando entienda como este m8todo de autenticacin funciona. Como
mencionamos antes re(uire*ut)() trabaja comparando una lla'e de autenticacin en la
informacin P#07 contra una lla'e guardada en la sesin del usuario. Por lo tanto el
componente de seguridad debe ser incluido tanto en el controlador (ue recibe la
peticin como en el controlador (ue la )ace.
Por ejemplo si yo tengo una accin en PostController con una 'ista conteniendo un
formulario (ue manda P#07 a una accin en CommentsController entonces el
componente de seguridad debe de ser incluido tanto en CommentsController ((ue esta
recibiendo la peticin y de )ec)o protegiendo la accin) como en PostController
(desde el cual la peticin se originar%).
Cada 'e3 (ue el componente de seguridad es cargado aAn si no es usado para proteger
una accin reali3a lo siguiente@ Primero genera una lla'e de autenticacin usando la
clase 0ecurity. /espu8s escribe esta lla'e en la sesin junto con una fec)a de
e&piracin y alguna informacin adicional (la fec)a de e&piracin es determinada por su
configuracin de seguridad de sesin en 2app2con,i-2core.php). En seguida guarda la
lla'e en su controlador para ser usada luego.
/espu8s en los arc)i'os de su 'ista cual(uier eti(ueta de formulario (ue genere usando
S)tmlXform7ag() tambi8n tendra un campo escondido con la lla'e de autenticacin. /e
esa manera cuando el formulario es en'iado mediante P#07 el componente de
seguridad puede comparar ese 'alor con el 'alor en la sesin donde se recibe la peticin.
En seguida la lla'e de autenticacin es regenerada y la sesin es actuali3ada para la
siguiente peticin.
Vie3 Cachin-
$eccin %
#ue es esto&
/esde la 'ersin :.C:.Q.9BPeDfinal Cake )a soportado cac)eo para las 'istas (7ambi8n
llamado Cac)eo a P%gina Completa). $o no se trara de una broma. *)ora es posible
cac)ear layouts y 'istas. 7ambi8n es posible marcar partes de las 'istas para (ue sean
ignoradas por el mecanismo de cac)e. Esta funcionalidad si es usada sabiamente puede
incrementar la 'elocidad de la aplicacin en una cantidad de tiempo considerable.
Cuando se solicita una ."+ Cake primero busca si la ."+ solicitada no )a sido ya
cac)eada. 0i es as Cake sortea el dispatc)er y de'uel'e lo ya renderi3ado 'ersin
cac)eada de la pagina. 0i la p%gina no est% en la cac)e Cake se comporta con
normalidad.
0i se )a acti'ado la funcionalidad de cac)eo Cake almacenar% la salida de su operacin
normal en la cac)e para usuarios futuros. +a pr&ima 'e3 (ue la p%gina sea solicitada
Cake la recoger% de la cac)e. >enial e)N 2amos a indagar para 'er como funciona.
$eccin &
Como fuciona&
Activando la cache
Por defecto el 'iew cac)ing est% des)abilitado. Para acti'arlo primero es necesario
cambiar el 'alor de C*CHEDCHECH en GappGconfigGcore.p)p de false a true@
<app<config<core/php 5parcial6
define $?C2CFE<CFECE?, true%C
Esta linea le dice a Cake (ue se (uiere )abilitar el 2iew Cac)ing.
En el controlador para las 'istas (ue se (uieran cac)ear se tiene (ue a<adir el Cac)e
)elper a el array )elpers@
var G/elpers H array$?Cac/e?%C
* continuacin 0e necesitar% especificar lo (ue se (uiere cac)ear.
(aria)le del controlador :cacheAction
En esta seccin 0e mostrar% como decirle a Cake lo (ue cac)ear. Esto se reali3a
iniciali3ando una 'ariable del controlador llamada Scac)e*ction. +a 'ariable
Scac)e*ction debera ser iniciali3ada por un array (ue contenga las acciones (ue se
(uiere (ue sean cac)eadas y el tiempo (en segundos) (ue se (uiere (ue se mantengan
esos datos. El 'alor del tiempo tambi8n puede ser un string amigable a strtotime() (p.e.
IC dayI IR: segundosI).
/igamos (ue se tiene un ProductsController con algunas cosas (ue nosotros (ueremos
(ue sean cac)eadas. +os siguientes ejemplos muestran como usar Scac)e*ction para
decirle a Cake (ue cac)ee ciertas partes de las acciones del controlador.
:cacheAction ,-emplos
00Cac/eamos un grupo de pginas de los productos .ue son visitados ms
a menudo, por un tiempo de seis /oras:
var Gcac/e2ction H array$
?vie*0;L0? H' ;:KMM,
?vie*0NV0? H' ;:KMM
%C
00Cac/eamos una accin entera. En este caso la lista de productos
denominada recalled, por un tiempo de seis /oras:
var Gcac/e2ction H array$?recalled0? H' VKNMM%C
00)i se .uisiera tamiJn, se podr3a cac/ear cada accin mediante la
asignacin de una cadena
00.ue es amigale a strtotime$% para indicar el tiempo de cac/eo.
var Gcac/e2ction H ": /our"C
00@amiJn es posile definir el cac/eo en las propias acciones usando
Gt/is&'cac/e2ction H array$%...
%arcando Contenido en la (ista
Hay instancias donde puede ser (ue no se (uiera (ue partes de una 'ista se cac)een. 0i
se tiene alguna cierta clase de elemento destacando nue'os productos se (uerra decirle
a Cake (ue cac)e la 'ista^ e&cepto una pe(ue<a parte.
Es posible decirle a Cake (ue no cac)ee el contenido en las 'istas mediante el uso de las
eti(uetas Wcake@nocac)eV WGcake@nocac)eV en'ol'iendo al contenido (ue se (uiere (ue
el motor de cac)e salte.
=ca1e:nocac/e' e,ample
=/:' 8e* (roducts> =0/:'
=ca1e:nocac/e'
=ul'
=Ip/p foreac/$Gne*(roducts as Gproduct%: I'
=li'GproductP?name?Q=0li'
=Iendforeac/CI'
=0ul'
=0ca1e:nocac/e'
1impiando la cache
Primero es necesario sbaer (ue Cake limpiar% autom%ticamente la cac)e si se reali3a un
cambio en la base de datos. Por ejemplo si una de las 'istas usa informacin desde un
modelo y se )a producido un ;$0E"7 .P/*7E o /E+E7E por el modelo Cake
limpiar% la cac)e para esa 'ista.
Pero podran e&istir casos donde se (uerra limpiar especficos fic)eros de cac)e. Para
)acer esto Cake proporciona la funcin clearCac)e la cual est% globalmente disponible@
Dcake?nocacheE e-emplo
007orrar todas las pginas cac/eadas .ue tengan el nomre controlador
clearCac/e$?controlador?%C
007orrar todas las pginas cac/eadas .ue tengan el nomre
controlador<accion
clearCac/e$?controlador<accion0?%C
007orrar todas las pginas cac/eadas .ue tengan el nomre
controlador<accion<parametros
008ota: se pueden tener m9ltiples parmentros.
clearCac/e$?controlador<accion<parametros?%C
00@u puedes tamiJn usar un array para limpiar m9ltiples cac/es en una
vez.
clearCac/e$array$?controlador<accion<parametros?,?controlador;<accion<
parametros?%%C
$eccin '
Cosas para recordar
* continuacin est%n un grupo de cosas para recordar sobre 2iew Cac)ing@
C. Para )abilitar el cac)e se debe asignar C*CHEDCHECH a true en
GappGconfigGcore.p)p
9. En el controlador para las 'istas (ue se desea cac)ear se tiene (ue a<adir el
Cac)e )elper en el array )elpers.
B. Para cac)ear ciertas ."+ use Scac)e*ction en el controlador.
,. Para saltar ciertas partes de una 'ista de ser cac)eadas se deben en'ol'er con las
eti(uetas Wcake@nocac)eV WGcake@nocac)eV
-. Cake limpiar autom%ticamente copias especficas de cac)e cuando se reali3an
cambios en la base de datos.
R. Para reali3ar una limpie3a manual de partes de la cac)e use clearCac)e().
E9e*plo1 /utenticacin si*ple de
usuarios
El -ran escenario
0i eres nue'o en CakePHP estar%s fuertemente tentado a copiar y pegar este cdigo
para utili3arlo en tu aplicacin en produccin de manejo de datos sensibles y de misin
crtica. "esiste@ este captulo es una e&posicin del funcionamiento interno de Cake no
sobre seguridad de aplicaciones. 1ientras dudo proporcionaremos algunas
e&tremadamente ob'ias trampas de seguridad el punto de este e9e*plos es *ostrarte
el ,unciona*iento interno de Cake y permitirte crear por ti mismo una entrada a
prueba de balas para tu aplicacin.
Cake tiene control de acceso a tra'8s de su incorporado motor de *C+s pero (ue
respecto a autenticacin de usuarios y persistenciaN Eu8 respecto a esoN
Fien por a)ora )emos encontrado (ue los sistemas de autenticacin de usuarios 'aran
de una aplicacin a otra. *lgunas como contrase<as ofuscadas otras como autenticacin
+/*P y casi cada aplicacin tendr% modelos de usuarios (ue son ligeramente
diferentes. Por a)ora te dejamos esta desicin. Esto cambiar%N $o estamos seguros aAn.
Por a)ora pensamos (ue la sobrecarga por construir esto en el framework no lo amerita
por(ue crear tu propio sistema de autenticacin de usuarios es f%cil con Cake.
$ecesitas solo tres cosas@
.na forma para autenticar usuarios (usualmente )ec)a 'erificando la identidad
del usuario con una combinacin usuarioGcontrase<a)
.na forma para registrar persistentemente ese usuario mientras na'ega por tu
aplicacin (usualmente )ec)a con sesiones)
.na forma de re'isar si un usuario )a sido autenticado (tambi8n a menudo )ec)a
interactuando con sesiones)
En este ejemplo crearemos un sistema simple para autenticacin de usuarios para un
sistema de administracin de clientes. Esta aplicacin ficticia podra probablemente ser
usada por una oficina para registrar informacin de contacto y notas relacionadas a
clientes. 7oda la funcionalidad del sistema ser% ubicada detr%s de nuestro sistema de
autenticacin de usuarios e&cepto por pocos bare!bones 'istas pAblicas seguras (ue
muestren Anicamente los nombres y ttulos de los clientes almacenados en el sistema.
Empe3aremos por mostrarte como 'erificar usuarios (ue tratan de acceder al sistema.
+a informacin de los usuarios autenticados ser% almacenada en sesiones PHP usando el
componente de Cake para sessiones. .na 'e3 (ue tengamos la informacin del usuario
en la sesin ubicaremos re'isiones en la aplicacin para asegurar (ue los usuarios de la
aplicacin no acceden a lugares a los (ue no deberan.
.na cosa a notar ! autenticacin no es lo mismo (ue control de acceso. 7odo en lo (ue
estaremos despu8s en este ejemplo es como 'er si la gente es (uien dice ser y
permitirles acceso b%sico a partes de la aplicacin. 0i deseas afinar este acceso re'isa el
captulo de +istas de Control de *cceso en Cake. Haremos notas sobre donde las *C+s
podran cal3ar pero por a)ora concentr8monos en la autenticacin simple de usuarios.
/ebera adem%s decir (ue esto no pretende ser'ir como es(uema de seguridad para
aplicaciones. 0olo (ueremos darte suficiente con (ue trabajar para (ue puedas construir
aplicaciones a prueba de balas por t mismo.
/utenticacin < Persistencia
Primero necesitamos una forma para almacenar informacin acerca de usuarios
tratando de acceder nuestro sistema de administracin de clientes. El sistema de
administracin de clientes (ue estamos usando almacena informacin de usuarios en
una tabla de base de datos (ue fue creada usando el siguiente 0E+@
Ga)la EusersE? Base de atos ,icticia del $iste*a de /d*inistracin de Clientes
C5E2@E @27+E euserse $
eide int$::% 8O@ 8"++ 2"@O<#8C5EME8@,
eusernamee varc/ar$;TT% 8O@ 8"++,
epass*orde varc/ar$L;% 8O@ 8"++,
efirst<namee varc/ar$;TT% 8O@ 8"++,
elast<namee varc/ar$;TT% 8O@ 8"++,
(5#M25R EER $eide%
%
Fastante simple correctoN El 1odelo de Cake para esta tabla puede ser sencillamente@
=Ip/p
class "ser e,tends 2ppModel
A
var Gname H ?"ser?C
D
I'
+o primero (ue necesitaremos son una 'ista y una accin para iniciar sesin. Esto
pro'eer% un camino para los usuarios de la aplicacin (ue intenten iniciar sesin y un
camino para (ue el sistema procese esa informacin para 'er si a estos se les debera
permitir el acceso al sistema no. +a 'ista es Anicamente un formulario H71+ creado
con la ayuda del *yudante Html de Cake.
2app2!ie3s2users2lo-in2tht*l
=Iif $Gerror%: I'
=p'+as credenciales para inicio de sesin proporcionadas no pueden ser
reconocidas. (or favor intente nuevamente.=0p'
=I endifC I'

=form actionH"=Ip/p ec/o G/tml&'url$?0users0login?%C I'"
met/odH"post"'
=div'
=lael forH"username"'8omre de usuario:=0lael'
=Ip/p ec/o G/tml&'input$?"ser0username?, array$?size? H' ;M%%C I'
=0div'
=div'
=lael forH"pass*ord"'Contrase6a:=0lael'
=Ip/p ec/o G/tml&'pass*ord$?"ser0pass*ord?, array$?size? H' ;M%%C
I'
=0div'
=div'
=Ip/p ec/o G/tml&'sumit$?+ogin?%C I'
=0div'
=0form'
Esta 'ista presenta un formulario simple para inicio de sesin para usuarios (ue traten
de acceder al sistema. +a accin para el formulario 2users2lo-in la cual est% en
.sersController se 'e as@
class "sersController e,tends 2ppController
A
function login$%
A
008o mostrar el mensa-e de error si no se /an proporcionado
datos.
Gt/is&'set$?error?, false%C

00)i un usuario /a proporcionado datos a travJs del
formulario.
if $>empty$Gt/is&'data%%
A
00(rimero, veamos si /ay usuarios en la ase de datos
00con el nomre de usuario proporcionado por el usuario
00utilizando el formulario:

Gsomeone H Gt/is&'"ser&'find7y"sername$Gt/is&
'dataP?"ser?QP?username?Q%C

00En este punto, Gsomeone est lleno con datos del
usuario, o est vac3o.
00Comparemos la contrase6a proporcionada a travJs del
formulario con la
00almacenada en la ase de datos.

if$>empty$GsomeoneP?"ser?QP?pass*ord?Q% ]]
GsomeoneP?"ser?QP?pass*ord?Q HH Gt/is&'dataP?"ser?QP?pass*ord?Q%
A

008ota: esperanzado en .ue las contrase6as estJn
ofuscadas en la ase de datos,
00tu comparacin podr3a verse ms como:
00mdT$Gt/is&'dataP?"ser?QP?pass*ord?Q% HH ...

00Esto significa .ue estas son iguales. 2/ora podemos
construir alguna informacin sica de
00sesin para recordar este usuario como con ?sesin&
iniciada?

Gt/is&')ession&'*rite$?"ser?, GsomeoneP?"ser?Q%C

002/ora .ue tenemos a los usuarios registrados en una
sesin, redireccionJmoslos a
00la pgina de reciimiento para la aplicacin.

Gt/is&'redirect$?0clients?%C
D
00Caso contrario, /an provisto datos incorrectos:
else
A
005ecuerdas la variale Gerror en la vistaI Camiemos
su valor a verdadero:

Gt/is&'set$?error?, true%C
D
D
D

function logout$%
A
005edirecciona usuarios a esta accin si /acen clic1 en el
otn Cerrar )esin.
00@odo lo .ue necesitamos /acer a.u3 es destruir la
informacin de sesin.

Gt/is&')ession&'delete$?"ser?%C

00R proalemente deer3amos redireccionarlos a alguna parte,
tamiJn...

Gt/is&'redirect$?0?%C
D
D
I'
$o tan mal@ el contenido de la accin login() podra ser de menos de 9: lneas si fueras
consiso. El resultado de esta accin es tanto C@ la informacin del usuario es registrada
en la sesin y este es redireccionado a la p%gina de bien'enida de la aplicacin o 9@
regresar a la pantalla de inicio de sesin y presentar el formulario de inicio de sesin
(con un mensaje de error adicional).
;e!isando acceso en tu /plicacin
*)ora (ue podemos autenticar usuarios )agamos (ue la aplicacin )ec)e usuarios (ue
traten de ingresar al sistema desde puntos diferentes a la pantalla de inicio de sesin y el
directorio =b%sico? de clientes (ue detallamos anteriormente.
.na forma de )acer esto es crear una funcin en *ppController (ue )ar% la re'isin de
la sesin y ec)ar% por t.
2app2app7controller.php
=Ip/p
class 2ppController e,tends Controller
A
function c/ec1)ession$%
A
00)i la informacin de sesin no /a sido definida...
if $>Gt/is&')ession&'c/ec1$?"ser?%%
A
00Borza al usuario a iniciar sesin
Gt/is&'redirect$?0users0login?%C
e,it$%C
D
D
D
I'
*)ora tienes una funcin (ue puedes utili3ar en cual(uier controlador para asegurar (ue
los usuarios no traten de acceder a acciones del controlador sin iniciar sesin primero.
.na 'e3 (ue esto est% en su sitio puedes re'isar el acceso en cual(uier ni'el ! a(u
algunos ejemplos@
:or0ar autenticacin antes de todas la acciones en un controlador
=Ip/p
class 8otesController e,tends 2ppController
A
008o .uieres usuarios no autenticados mirando cual.uier accin
00en este controladorI "tiliza eforeBilter para .ue Ca1e e-ecute
c/ec1)ession
00antes .ue cual.uier accin.

function eforeBilter$%
A
Gt/is&'c/ec1)ession$%C
D
D
I'
:or0ar la autenticacin antes de una accin en un controlador
=Ip/p
class 8otesController e,tends 2ppController
A
function pulic8otes$Gclient#4%
A
002cceso p9lico a esta accin est ien ...
D

function edit$Gnote#d%
A
00(ero solo .uieres usuarios autenticados en esta accin.
Gt/is&'c/ec1)ession$%C
D
D
I'
*)ora (ue tienes las bases podras a'enturarte por tu cuenta e implementar algunas
caractersticas a'an3adas a la medida sobre las (ue )an sido delineadas a(u. +a
integracin con el componente de *C+s de Cake podra ser un buen primer paso.
Con!enciones de Cake
Con!enciones? eh?
0i con'enciones. /e acuerdo a t)efreedictionary@
*cuerdo general en o de ciertas pr%cticas actitudes@ Por con'encin el norte
est% arriba en la mayora de mapas.
.na pr%ctica procedimiento ampliamente obser'ada en un grupo
especialmente para facilitar la interaccin socialY una costumbre@ la con'encin
de dar la mano para saludar.
.n dispositi'o t8cnica ampliamente usada y aceptada tanto en drama
literatura pintura@ la con'encin teatral del aparte.
+as con'enciones en cake son lo (ue )ace (ue la magia ocurra l8elo autoB*-ico. $o
es necesario decir (ue fa'oreciendo las con'enciones sobre la configuracin Cake
incrementa tu producti'idad a un temible ni'el sin ninguna p8rdida de fle&ibilidad. +as
con'enciones en cake son realmente simples e intuiti'as. Estas son e&traidas de las
mejores pr%cticas (ue buenos desarrolladores web )an utili3ado a tra'8s de a<os en el
campo del desarrollo web.
Lo*)res de archi!os
+os nombres de arc)i'os son con -uiones )a9os. Como regla general si tienes una
clase M<Li,t<Class entonces en Cake su arc)i'o debera ser nombrado
myDniftyDclass.p)p
0i encuentras un snippet autom%ticamente sabr%s (ue@
0i este es un Controlador nombrado Iisses/ndHu-sController el nombre de
su arc)i'o deber% ser kisses7and7hu-s7controller.php (obser'a Dcontroller en
el nombre del arc)i'o)
0i este es un 1odelo nombrado (ptionValue el nombre de su arc)i'o deber%
ser option7!alue.php
0i este es un Componente nombrado M<Hand<Co*ponent el nombre de su
arc)i'o deber% ser *<7hand<.php (no se necesita Dcomponent en el nombre del
arc)i'o)
0i este es un *yudante nombrado BestHelperE!er el nombre de su arc)i'o
deber% ser )est7helper7e!er.php
Modelos
+os nombres de las clases 1odelo son sin-ulares.
+os nombres de las clases 1odelo empie3an con mayAscula para modelos con
'arias palabras se emplea nomenclatura Camel mayAscula.
o Ejemplos@ Person 1onkey >lass/oor +ine;tem "eally$ifty7)ing
+as tablas de juntura de relaciones muc)os a muc)os debera ser nombradas@
alfab8ticamenteDprimeraDtablaDpluralDalfab8ticamenteDsegundaDtablaDplural
pe@ eti(uetasDusuarios
+os nombres de arc)i'os de modelos usan minAsculas y guiones bajos.
o Ejemplos@ person.p)p monkey.p)p glassDdoor.p)p lineDitem.p)p
cosaDrealmenteDelegante.p)p
+as tablas de la base de datos relacionadas a los modelos tambi8n usan
minAsculas y guiones bajos pero estas est%n en plural.
o Ejemplos@ people monkey glassDdoors lineDitems reallyDniftyDt)ings
+as con'enciones de nombres en CakePHP buscan guiar la creacin de cdigo y )acer
el mismo m%s f%cil de leer. 0i estas est%n en tu camino puedes sobreescribirlas.
$ombre de modelo@ 0et var Gname en tu definicin de modelo
7abla de base de datos relacionada a tu modelo@ 0et var Guse@ale en tu
definicin de modelo.
Controladores
+os nombres de las clases Controlador son en plural.
+os nombres de las clases Controlador empien3an con mayAscula para
controladores con 'arias palabras se emplea nomenclatura Camel mayAscula.
7ambi8n los nombres de clases Controlador terminan con IControllerI.
Ejemplos@ PeopleController 1onkeysController >lass/oorsController
+ine;temsController "eally$ifty7)ingsController
+os nombres de arc)i'o de controladores usan minAsculas y guiones bajos.
7ambi8n los nombres de arc)i'o de controladores terminan con IDcontrollerI. 0i
tienes una clase controladora llamada PostsController el nombre del arc)i'o
debera ser postsDcontroller.p)p
o Ejemplos@ peopleDcontroller.p)p lineDitemsDcontroller.p)p
reallyDniftyDt)ingsDcontroller.p)p
Para 'isibilidad protegida a los nombres de las acciones del controlador se
deber% anteponer I!I.
Para 'isibilidad pri'ada a los nombres de las acciones del controlador se deber%
anteponer IfI.
Vistas
+as 'istas son nombradas como las acciones (ue presentan.
+os nombres de arc)i'os de 'istas son como los nombres de las acciones en
minAsculas.
o Ejemplos@ (eopleController::*orld(eace$% espera una 'ista en
GappG'iewsGpeopleGworldDpeace.t)tmlY Mon1eysController::anana$%
espera una 'ista en GappG'iewsGmonkeysGbanana.t)tml.
Puedes for3ar a una accin a presentar (render) una 'ista especfica llamando
Gt/isfrender(InombreDdelDarc)i'oDdeDlaD'istaDsinDpuntoDt)tmlI)Y al final de tu
accin.
/<udantes
El nombre de la clase de un ayudante usa nomenclatura Camel y termina en
IHelperI el nombre del arc)i'o utili3a guiones bajos.
o Ejemplo@ class MyFelperFelper e,tends Felper est% en
GappG'iewsG)elpersGmyD)elper.p)p.
0e incluye en el controlador con var G/elpers H array$?Ftml?, ?MyFelper?%Y en
la 'ista puedes acceder con GmyFelperfmet/od$%.
Co*ponentes
El nombre de una clase componente usa nomenclatura Camel y termina en
IComponentI el nombre del arc)i'o utili3a guiones bajos.
o Ejemplo@ class MyComponentComponent e,tends O-ects est% en
GappGcontrollerGcomponentsGmyDcomponent.p)p
0e incluye en el controlador con var Gcomponents H array$?MyComponent?%Y en el
controlador puedes accecer con Gt/isfMyComponentfmet/od$%.
Vendedores
+os 'endedores no siguen ninguna con'encin por ob'ias ra3ones@ son pie3as de cdigo
de terceros. Cake no tiene control sobre estas.

También podría gustarte