Documentos de Académico
Documentos de Profesional
Documentos de Cultura
CAKEPHP
CAKEPHP
Integrantes:
Criollo Stalin
Jahuaco Dario
Molina Omar
Tuquinga Jorge
Jornada: Nocturna
Paralelo: A
1. Introducción
Conocer el framework cake php para saber cómo se utiliza, como funciona y en que
puede servir al momento de desarrollar para llegar a facilitar el desarrollo de la programación.
2. Objetivos
Consultar el framework cake php para sus usos y aplicaciones para facilitar el
desarrollo.
3. Framework CAKEPHP
¿Cómo se utiliza?
Si reconoces un error, algo que está incompleto, algo que no ha sido cubierto en su
totalidad, o algo que simplemente no está escrito a tu gusto, aquí te explicamos cómo puedes
ayudar:
Inicia sesión en el Cookbook utilizando tu cuenta de Bakery. ¡Cualquiera puede
conseguir una cuenta!
Envía tus ediciones o adiciones para su revisión, utilizando semántica HTML
válida.
Sigue el progreso de tus envíos usando los feeds rss o revisa al día siguiente para
ver tus cambios aprobados.
`Las aplicaciones CakePHP bien escritas siguen el patrón de diseño de software MVC
(Modelo-Vista-Controlador). Programar utilizando MVC consiste en separar la aplicación en tres
partes principales. El modelo representa los datos de la aplicación, la vista hace una presentación
del modelo de datos, y el controlador maneja y enruta las peticiones [requests] hechas por los
usuarios.
Figura 1 MVC
Beneficios
¿Por qué utilizar MVC? Porque es un patrón de diseño de software probado y se sabe
que funciona. Con MVC la aplicación se puede desarrollar rápidamente, de forma modular y
mantenible. Separar las funciones de la aplicación en modelos, vistas y controladores hace que la
aplicación sea muy ligera. Estas características nuevas se añaden fácilmente y las antiguas toman
automáticamente una forma nueva.
El diseño modular permite a los diseñadores y a los desarrolladores trabajar
conjuntamente, así como realizar rápidamente el prototipado. Esta separación también permite
hacer cambios en una parte de la aplicación sin que las demás se vean afectadas.
Aunque lleva algún tiempo acostumbrarse a construir aplicaciones así, estamos seguros
de que, una vez construyas tu primera aplicación con CakePHP, no querrás volver a hacerlo de
otra forma. (https://book.cakephp.org/, n.d.)
¿Qué se necesita?
Requerimientos
Permisos
Instalación
Instalar CakePHP puede ser tan simple como colocar el directorio en el servidor, o
tan complejo y flexible como necesites. Esta sección cubrirá los tres tipos principales de
instalación para CakePHP: desarrollo, producción y avanzado
Desarrollo: fácil para iniciar, los URL de la aplicación incluyen el nombre del
directorio, y es menos seguro.
Producción: Requiere la capacidad de configurar el servidor web para definir el
“document root”, muy seguro.
Avanzado: Con cierta configuración, permite ubicar los directorios clave de
CakePHP en diferentes partes del sistema de archivos, para compartir una misma
instalación de CakePHP para varias aplicaciones.
Desarrollo
Usar una instalación de desarrollo es el método más rápido para montar Cake.
Este ejemplo te ayudará a instalar una aplicación de CakePHP y hacerla disponible
en http://www.ejemplo.com/cake_1_2/. Asumimos para el fin de este ejemplo que tu raíz
de documentos está establecido a /var/www/html.
Descomprime los contenidos del archivo Cake en /var/www/html. Ahora tienes una
carpeta en tu raíz de documentos con un nombre dependiente de la versión que te has
descargado (p.ej. cake_1.2.0.7962). Renombra esta carpeta a cake_1_2. Tu configuración
de desarrollo será como la siguiente en el sistema de archivos:
/var/www/html
cake_1_2
/app
/cake
/vendors
.htaccess
/index.php
README
Si tu servidor web está configurado correctamente, deberías encontrar tu aplicación
de Cake accesible en http://www.ejemplo.com/cake_1_2/.
Producción
Una instalación de producción es una manera más flexible de instalar Cake. Usar
este método permite que un dominio entero se comporte como una aplicación CakePHP
única. Este ejemplo te ayudará a installar Cake en cualquier sitio de tu sistema de ficheros
y ponerlo disponible en http://www.ejemplo.com. Tener en cuenta que esta instalación
puede requerir los privilegios para cambiar el DocumentRoot (raíz de documentos) en
servidores web Apache.
Descomprime los contenidos del archivo Cake en un directorio a tu elección. Por
motivos de ejemplo, asumimos que escoges instalar Cake en /cake_install. Tu
configuración de producción se verá de la siguiente manera en el sistema de ficheros:
/cake_install/
/app
/webroot (este directorio es el establecido con la directiva DocumentRoot)
/cake
/vendors
/.htaccess
/index.php
/README
Los desarrolladores que usan Apache deberán establecer la
directiva DocumentRoot para el dominio a:
DocumentRoot /cake_install/app/webroot
Si tu servidor web está configurado correctamente, deberías encontrar tu aplicación
Cake accesible en http://www.ejemplo.com.
Instalación Avanzada
if (!defined('ROOT')) {
define('ROOT', DS.'home'.DS.'yo');
}
if (!defined('APP_DIR')) {
define ('APP_DIR', 'misitio');
}
if (!defined('CAKE_CORE_INCLUDE_PATH')) {
define('CAKE_CORE_INCLUDE_PATH', DS.'usr'.DS.'lib');
}
Es recomendable utilizar la constante DS en lugar de barras inclinadas para
delimitar las rutas de los archivos. Esto evita errores por falta de archivo como resultado de
usar el delimitador equivocado, y además hace tu código más portable.
A pesar de que CakePHP está hecho para funcionar con mod_rewrite sin tocar
nada, y normalmente así es, hemos notado que algunos usuarios tienen dificultades para
lograr que todo funcione correctamente en sus sistemas.
Aquí hay unas cuantas cosas que puedes probar para conseguir que funcione
correctamente. Primero mira en tu httpd.conf (asegúrate de estar editando el httpd.conf del
sistema y que no es httpd.conf específico de un usuario o del site).
Asegúrate que la reescritura .htaccess esté permitida y que AllowOverride esté
establecido a All para el DocumentRoot adecuado. Deberías ver algo similar a:
#
# Cada directorio al que tiene acceso Apache puede ser
configurado en
# función de qué servicios y características están permitidas
y/o
# desactivadas en dicho directorio (y sus subdirectorios).
#
# Primero, configuramos "por defecto" para que sea un conjunto
de
# características muy restrivo.
#
<Directory />
Options FollowSymLinks
AllowOverride All
# Order deny,allow
# Deny from all
</Directory>
Asegúrate de estar cargando el módulo mod_rewrite correctamente. Debes ver
algo como:
LoadModule rewrite_module libexec/apache2/mod_rewrite.so
En muchos sistemas esto estará comentado (comenzando la línea con #) por
defecto, así que sólo tendrás que quitar los símbolos # del principio.
Tras realizar los cambios reinicia Apache para estar seguro de que las opciones de
configuración están activas.
Asegúrate de que tus ficheros .htaccess están en los directorios correctos. Esto
puede pasar durante la copia porque algunos sistemas operativos consideran los archivos
que comienzan por ‘.’ como ocultos y por lo tanto no los copian.
Asegúrate de que tu copia de CakePHP es de las sección de descargas de
nuestro site o nuestro repositorio GIT, y que ha sido desempaquetado correctamente
verificando que existen los ficheros .htaccess:
En el directorio raíz de Cake (necesita ser copiado al directorio, esto redirige todo a
tu aplicación de Cake):
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule ^$ app/webroot/ [L]
RewriteRule (.*) app/webroot/$1 [L]
</IfModule>
En el directorio app de Cake (será copiado por bake):
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule ^$ webroot/ [L]
RewriteRule (.*) webroot/$1 [L]
</IfModule>
En el directorio webroot de Cake (será copiado a tu webroot de la aplicación por
bake):
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
</IfModule>
En muchos servicios de hosting (GoDaddy, 1and1), tu servidor web está realmente
siendo servido desde un directorio de usuario que ya utiliza mod_rewrite. Si estás
instalando CakePHP en un directorio de usuario
(http://ejemplo.com/~nombreusuario/cakephp), o en cualquier otra estructura que ya
utilice mod_rewrite necesitarás añadir sentencias RewriteBase a los archivos .htaccess que
utiliza CakePHP (/.htaccess, /app/.htaccess, /app/webroot/.htaccess)
Esto puede ser añadido a la misma sección con la directiva RewriteEngine , así, por
ejmplo, tu archivo .htaccess en el webroot devería ser así:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
</IfModule>
Los detalles de esos cambios dependen de tu configuración, y pueden incluir cosas
adicionales que no están relacionadas con Cake. Consulta la documentación online de
Apache para más información.
Lighttpd y mod_magnet
-- la magia ;)
if (not file_exists(lighty.env["physical.path"])) then
-- fichero aún desaparecido, pasarlo al fastcgi Backend
request_uri = removePrefix(lighty.env["uri.path"], prefix)
if request_uri then
lighty.env["uri.path"] = prefix .. "/index.php"
local uriquery = lighty.env["uri.query"] or ""
lighty.env["uri.query"] = uriquery .. (uriquery ~= "" and "&" or "") .. "url=" ..
request_uri
lighty.env["physical.rel-path"] = lighty.env["uri.path"]
lighty.env["request.orig-uri"] = lighty.env["request.uri"]
lighty.env["physical.path"] = lighty.env["physical.doc-root"] ..
lighty.env["physical.rel-path"]
end
end
-- fallthrough pondrá de nuevo la solucititud en el bucle lighty
-- eso significa que tenemos la manipulación 304 de forma gratuita. ;)
If you run your CakePHP installation from a subdirectory, you must set prefix =
‘subdirectory_name’ in the above script.
Then tell Lighttpd about your vhost:
$HTTP["host"] =~ "example.com" {
server.error-handler-404 = "/index.php"
magnet.attract-physical-path-to = ( "/etc/lighttpd/cake.lua" )
server.document-root = "/var/www/cake-1.2/app/webroot/"
nginx es un servidor popular que, del mismo modo que Lighttpd, consume menos
recursos del sistema. Su inconveniente es que no utiliza ficheros .htaccess como Apache y
Lighttpd, por lo que es necesario crear esas reescrituras de URLs en la configuración de
site-available. Dependiendo de tu configuración, necesitarás modificar esto, pero como
mínimo necesitarás que PHP se ejecute como instancia de FastCGI.
server {
listen 80;
server_name www.ejemplo.com;
rewrite ^(.*) http://ejemplo.com$1 permanent;
}
server {
listen 80;
server_name ejemplo.com;
access_log /var/www/ejemplo.com/log/access.log;
error_log /var/www/ejemplo.com/log/error.log;
location / {
root /var/www/ejemplo.com/public/app/webroot/;
index index.php index.html index.htm;
if (-f $request_filename) {
break;
}
if (-d $request_filename) {
break;
}
rewrite ^(.+)$ /index.php?q=$1 last;
}
location ~ .*\.php[345]?$ {
include /etc/nginx/fcgi.conf;
fastcgi_pass 127.0.0.1:10005;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME
/var/www/ejemplo.com/public/app/webroot$fastcgi_script_name;
}
}
IIS7 no tiene soporte nativo para archivos .htaccess. Aunque hay agregados que
proporcionan ese soporte, también pueden importarse las reglas htacess en IIS para usar
las reescritura nativa de CakePHP. Para hacer esto, siga los siguientes pasos:
Use el Instalador de Plataforma Web de Microsoft para instalar el Módulo URL
Rewrite 2.0.
Crear un nuevo archivo en el folder de CakePHP llamado web.config
Usando Notepad u otro editor XML-seguro, copiar el siguiente código en el archivo
web.config recién creado.
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="Redirect static resources"
stopProcessing="true">
<match url="^(ico|img|css|files|js)(.*)$" />
<action type="Rewrite" url="app/webroot/{R:1}{R:2}"
appendQueryString="false" />
</rule>
<rule name="Imported Rule 1" stopProcessing="true">
<match url="^(.*)$" ignoreCase="false" />
<conditions logicalGrouping="MatchAll">
<add input="{REQUEST_FILENAME}"
matchType="IsDirectory" negate="true" />
<add input="{REQUEST_FILENAME}"
matchType="IsFile" negate="true" />
</conditions>
<action type="Rewrite" url="index.php?url={R:1}"
appendQueryString="true" />
</rule>
<rule name="Imported Rule 2" stopProcessing="true">
<match url="^$" ignoreCase="false" />
<action type="Rewrite" url="/" />
</rule>
<rule name="Imported Rule 3" stopProcessing="true">
<match url="(.*)" ignoreCase="false" />
<action type="Rewrite" url="/{R:1}" />
</rule>
<rule name="Imported Rule 4" stopProcessing="true">
<match url="^(.*)$" ignoreCase="false" />
<conditions logicalGrouping="MatchAll">
<add input="{REQUEST_FILENAME}"
matchType="IsDirectory" negate="true" />
<add input="{REQUEST_FILENAME}"
matchType="IsFile" negate="true" />
</conditions>
<action type="Rewrite" url="index.php?url={R:1}"
appendQueryString="true" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>
También es posible usar la funcionalidad Import en el módulo URL Rewrite de IIS
para importar reglas directamente del archivo .htaccess de CakePHP’s en root, /app/, and
/app/webroot/ - aunque puede ser necesaria alguna edición para lograr que funcionen.
Cuando se importan las reglas de esta manera, IIS automáticamente creará el archivo
web.config para nosotros.
Una vez que se cree el archivo web.config con las reglas de reescritura aceptadas
por IIS, los vínculos, css, js y redireccionamiento en CakePHP deben funcionar
correctamente.
Enciéndelo
La Clase de Configuración
A pesar de que muy pocas cosas necesitan configuración en CakePHP, a veces es útil
tener tus propias reglas de configuración para tu aplicación. En el pasado seguramente habrías
definido alguno de estos valores creando constantes en varios archivos. Hacerlo de esa manera te
obligaría a incluir estos archivos cada vez que desees utilizarlos
La nueva clase Configure de CakePHP puede ser utilizada para guardar y recuperar
valores específicos de la aplicación o de tiempo de ejecución. Se cuidadoso, esta clase permite
almacenar cualquier cosa en ella, para luego usarla en cualquier lugar de tu código: una tentación
segura para romper el patrón MVC con el cual fue diseñado CakePHP. El objetivo principal de la
clase Configure es mantener centralizadas las variables que pueden ser compartidas entre varios
objetos. Recuerda tratar de mantener la filosofía de “convención sobre configuración” y así no
terminarás rompiendo la estructura MVC que se ha diseñado
Esta clase actúa como un singletón, y sus métodos pueden ser llamados desde cualquier
lugar en tu aplicación, en un contexto estático
<?php Configure::read('debug'); ?>
Métodos de la Clase Configure
write
write(string $clave, mixed $valor)
Utiliza write() para almacenar datos en la configuración de la aplicación
Configure::write('Empresa.nombre','Pizza, Inc.');
Configure::write('Empresa.lema','Pizza para tu cuerpo y alma');
Nota el uso de la notación punto en el parámetro $clave. Puedes utilizar esta
notación para organizar tus configuraciones dentro de grupos lógicos
El ejemplo anterior pudo ser escrito en una sola llamada:
Configure::write(
'Empresa',array('nombre'=>'Pizza, Inc.','lema'=>'Pizza para
tu cuerpo y alma')
);
Puedes utilizar Configure::write(‘debug’, $int) para cambiar entre desarrollo y
producción dentro de la ejecución de tu programa. Esto es especialmente útil para
interacciones AMF o SOAP donde la información de depuración puede ocasionar problema
de parseo.
read
read(string $clave = 'debug')
Se usa para leer datos de configuración de la aplicación. Por defecto devuelve el
importante valor de “debug” (nivel de depuración). Si se especifica una clave, los datos
correspondientes son devueltos. Usando nuestros anteriores ejemplos de write(),
podemos leer esos datos de vuelta:
Configure::read('Empresa.nombre'); //devuelve: 'Pizza, Inc.'
Configure::read('Empresa.lema'); //devuelve: 'Pizza para tu
cuerpo y alma'
Configure::read('Empresa');
//devuelve:
array('nombre' => 'Pizza, Inc.', 'lema' => 'Pizza para tu cuerpo
y alma');
delete
delete(string $clave)
Se usa para borrar información de configuración de la aplicación.
Configure::delete('Empresa.nombre');
load
load(string $path)
Usa este método para cargar información de configuración desde una archivo
específico.
// /app/config/mensajes.php:
<?php
$config['Empresa']['nombre'] = 'Pizza, Inc.';
$config['Empresa']['lema'] = 'Pizza para tu cuerpo y alma';
$config['Empresa']['telefono'] = '555-55-55';
?>
<?php
Configure::load('mensajes');
Configure::read('Empresa.nombre');
?>
Cada clave-valor de la configuración está representado en el archivo con la
variable $config. Cualquier otra variable que aparezca en el archivo será ignorada por la
función load().
version
version()
Devuelve la versión de CakePHP de la aplicación actual.
Constantes de Configuración
La Clase App
Cargar clases adicionales se ha vuelto mucho más sencillo con CakePHP. En versiones
anteriores existían funciones diferentes para cargar una clase dependiendo de su tipo. Estas
funciones han sido reemplazadas, ahora toda la carga de clases debería hacerse a través de el
método App::import(). Éste método te asegura que una clase ha sido cargada sólo una vez, que
las clases que extiende se hayan cargado apropiadamente, y resuelve las rutas de ubicación
automáticamente en la gran mayoría de los casos
Usando App::import()
App::import($type, $name, $parent, $search, $file, $return);
A primera vista App::import parece complejo, sin embargo, en la mayoría de los casos
es suficiente con tan sólo dos parámetros.
Importando librerías del Core
Las librerías del Core, como Sanitize y Xml pueden ser cargadas mediante:
App::import('Core', 'Sanitize');
Lo anterior hará que la clase Sanitize esté disponible para su uso.
Componentes
Todas las clases relacionadas con la aplicación pueden ser importadas con
App::import(). Los siguientes ejemplos muestran cómo hacerlo:
Cargando Controladores
App::import('Controller', 'MyController');
Llamando a App::import es equivalente a require. Es importante darse cuenta que
la clase posteriormente necesita ser inicializada.
<?php
// Lo mismo que require('controllers/users_controller.php');
App::import('Controller', 'Users');
Cargar clases en plugins funciona casi igual que cargar clases ubicadas en el Core o en
la aplicación principal, a excepción de que debe especificarse el nombre del plugin donde reside
la clase a cargar.
App::import('Modelo', 'NombrePlugin.Comentario');
La función vendor() ha sido reemplazada. Los archivos de terceros deben ser cargados
también mediante App::import(). La sintaxis y los argumentos adicionales son levemente
diferentes, debido a que los archivos de terceros y su estructura pueden variar inmensamente, y
no todos los archivos de terceros contienen clases.
Los siguientes ejemplos ilustran cómo cargar archivos de terceros en diferentes rutas y
estructuras. Los archivos de terceros deben estar ubicados en cualquiera de los
directorios vendor.
Ejemplos de archivos de terceros
Para cargar vendors/geshi.php
App::import('Vendor', 'geshi');
Para cargar vendors/flickr/flickr.php
App::import('Vendor', 'flickr/flickr');
Para cargar vendors/cierto.nombre.php
App::import('Vendor', 'CiertoNombre', array('file' =>
'cierto.nombre.php'));
Para cargar vendors/services/well.named.php
App::import('Vendor', 'WellNamed', array('file' =>
'services'.DS.'well.named.php'));
Configuración de Rutas
El enrutamanieto permite hacer una relación entre URLs y acciones de los controller.
Fue añadido a CakePHP para hacer más bonitos los URLs, más configurables, y más flexibles.
Usar el mod_rewrite de Apache no es un requisito para utilizar el enrutamiento, pero hará lucir
mucho mejor tu barra de direcciones.
Las rutas en CakePHP 1.2 han sido mejoradas y pueden llegar a ser muy poderosas.
Antes de que aprendas a configurar tus propias rutas, deberías saber que CakePHP viene
configurado con un conjunto de rutas por defecto. Estas rutas te llevarán bastante lejos en
cualquier aplicación. Puedes acceder a una acción directamente desde el URL colocando su
nombre en la petición. También puedes pasar parámetros a las acciones de tus controladores
usando el URL.
Patron URL de las rutas por defecto:
http://example.com/controlador/accion/param1/param2/param3
El URL /articulos/ver dirige a la acciónver() action del ArticulosController, y
/productos/listaCompleta dirige a la accion to the lista_completa() de ProductosController. Si no
se especifica ninguna acción en el URL, se asume que se trata de la acción index().
La configuración inicial de enrutamiento permite pasar parámetros a tus acciones
usando el URL. Una petición para /articulos/ver/25 sería equivalente a llamar ver(25) en el
ArticulosController, por ejemplo.
Algo novedoso en CakePHP 1.2 es la habilidad de usar parámetros con nombre (named
parameters). Puedes nombrar parámetros y enviar sus valores usando el URL. Una petición para
/articulos/ver/titulo:primer+articulo/categoria:general resultaría en una llmada a la accion view()
de ArticulosController. En dicha acción, puedes encontrar los valores del título y la categoría
dentro de $this->passedArgs[‘titulo’] and $this->passedArgs[‘categoria’] respectivamente.
Algunos ejemplos que resuman las rutas por defecto puede resultar útil.
URL: /monos/saltar
Dirige a: MonosController->saltar();
URL: /productos
Dirige a: ProductosController->index();
URL: /tareas/ver/45
Dirige a: TareasController->ver(45);
URL: /donaciones/ver/recientes/2001
Dirige a: DonacionesController->ver('recientes', '2001');
URL: /contenidos/ver/capitulo:modelos/seccion:asociaciones
Dirige a: ContenidosController->ver();
$this->passedArgs['capitulo'] = 'modelos';
$this->passedArgs['seccion'] = 'asociaciones';
Definir Rutas
Definir tus propias rutas te permite definir cómo va a responder tu aplicación cuando se
solicite un URL determinado. Tus rutas deben ser definidas en el archivo /app/config/routes.php
usando el método Router::connect().
El método connect() toma hasta tres parámetros: el patron de URL que deseas hacer
coindicir, los valores por defecto para los elementos de enrutamient propios, y expresiones
regulares que ayuden al enrutador a hacer coincidir elementos en el URL.
El formáto básico para una definición de ruta es:
Router::connect(
'URL',
array('nombreParam' => 'valorPorDefecto'),
array('nombreParam' => 'expresionRegular')
)
El primer parámetro es usado para decirle al enrutador qué tipo de URL estás tratando
de controlar. El URL es una cadena de caracteres separadas por barras inclinadas (slash), pero
también pueden contener el un comodín comodín (*) o elementos de enrutamiento propios
(Elementos de URL prefijados con el caracter dos puntos ”:”). Usar un comodín le indica al
enrutador qué tipos de URL quieres hacer coincidir, y especificar elementos de enrutamiento te
permite recolectar parámetros para las acciones de tus controladores
Una vez que hayas especificado un URL, debes utilizar los últimos dos parámetros del
método connect() para decirle a CakePHP que hacer con esa petición una vez que ha sido
seleccionada la regla adecuada. El segundo parámetro es una arreglo asociativo. Las claves de
este arreglo deben ser nombradas como los elementos de enrutamiento en el URL, o los
elementos por defecto, que son, :controller, :action y :plugin. Los valores en este arreglo son los
valores por omisión para cada una de las claves. Veamos algunos ehjemplos básicos antes de
empezar a usar el tercer parámetro de connect()
Router::connect(
'/pages/*',
array('controller' => 'pages', 'action' => 'display')
);
Esta ruta se encuentra en el archivo routes.php distribuido con CakePHP (linea 40). Esta
ruta coincide con los URL que comienzan con /pages/ y delega a la acción display() de
PagesController el manejo de la petición. La petición /pages/productos puede sería dirigida a
PagesController->display(‘productos’), por ejemplo.
Router::connect(
'/mujeres',
array('controller' => 'productos', 'action' => 'mostrar', 5)
);
Este segundo ejemplo muestra como usar el segundo parámetro de connect() para
definir parámetros por omisión. Si construiste un sitio que muestra productos para diferentes
categorías de clientes, puedes considerar el hacer una ruta. Esto te ayuda a crear el enlace
/mujeres en lugar de /productos/mostrar/5
Para tener flexibilidad adicional, puedes especificar elementos de enrutamiento propios.
Hacer esto te da el poder de definir lugares en el URL donde los parámentros para las acciones
deben residir. Cuando se hace una petición, los valores para estos elementos propios se
encuentran en $this-gt;params del controlador. Estos son diferentres de los parametros con
nombre, y esta es la diferencia: los parmámetros con nombre (/controlador/accion/nombre:valor)
se encuentran en $this->passedArgs, mientras que los elementos propios de enrutamiento se
encuentran en $this->params. Cuando defines un elemento propio de enrutamiento, también
necesitas especificar una expresión regular. Esto le indica a CakePHP cómo reconocer si el URL
está bien formado o no.
Router::connect(
'/:controller/:id',
array('action' => 'ver'),
array('id' => '[0-9]+')
);
Este ejemplo sencillo muestra cómo crear una manera sencilla de ver registros desde
cualquier controlador accediendo a un URL que luce como /mincontrolador/id. El URL
suministrado a connect() especifica dos elementos de enrutamiento, :controller e :id, El primer
elemento es uno que viene por defecto con CakePHP, así que el enrutador sabe cómo reconocer
nombres de controladores en el URL. El elemento :id es propio, y debe ser clarificado
especificando una expresión regular en el tercer parámetro de conenct(). Esto le dice a CakePHP
cómo reconocer el ID en el URL en contraposición a cualquier otra cosa que esté allí, como el
nombre de una acción.
Una vez que hayas definido esta ruta, solicitar /manzanas/5, sería lo mismo que solicitar
/manzanas/ver/5. Ambos harán una llamada al método ver() de ManzanasController. Dentro del
método ver(), podrías acceder al id en $this->params[‘id’].
unejemplo más y serás un profesional del enrutador.
Router::connect(
'/:controller/:year/:month/:day',
array('action' => 'listar', 'day' => null),
array(
'year' => '[12][0-9]{3}',
'month' => '(0[1-9]|1[012])',
'day' => '(0[1-9]|[12][0-9]|3[01])'
)
);
Puede parecer un poco enredado, pero muestra lo poderosas que pueden ser las
rutas. El URL suministrado tiene cuatro elemento. El primero ya debe resultarte familiar: el
elemento que le dice a CakePHP que se trata de un nombre de controlador.
A continuación, vamos a especificar algunos valores por defecto. Sin importar el
controlador, queremos que la acción listar() sea llamada. Asignamos el parámetro day (día,
que es el cuarto elemento en el URL) a null, para marcarlo como opcional.
Finalmente especificamos algunas expresiones regulares que coindidiran con
años, meses y días en su forma numérica.
Una vez definda, esta ruta coindcidirá con /articulos/2007/02/01,
/escritos/2004/11/16 y /productos/2001/05 (¿recuerdas que el parametro day era
opcional?), enviando la petición a listar() de sus respectivos controladores, con los
parámetros de fecha definidos en $this->params.
Asumiendo que tu acción fue definida como se muestra a continuación, y que desea
acceder a los argumentos usando $articuloID en lugar de $this->params[‘id’], simplemente
agrega el tercer parámetro de Router::connect().
// some_controller.php
function ver($articuloID = null, $slug = null) {
// mi codigo aqui...
}
// routes.php
Router::connect(
// E.g. /blog/3-CakePHP_Rocks
'/blog/:id-:slug',
array('controller' => 'blog', 'action' => 'ver'),
array(
// el orden importa, puesto que esto enviará ":id" como
el parámetro $articuloID de tu acción.
'pass' => array('id', 'slug'),
'id' => '[0-9]+'
)
)
Y ahora, gracias a las capacidades de enrutamiento inverso, puedes usar el arreglo de url
que se muestra a continuación y Cake sabrá cómo formar el URL tal como fue definido en las
rutas.
// ver.ctp
// Esto va a devolver un lik a /blog/3-CakePHP_Rocks
link('CakePHP Rocks', array(
'controller' => 'blog',
'action' => 'view',
'id' => 3,
'slug' => Inflector::slug('CakePHP Rocks')
)) ?>
Antes de que leas como configurar tus rutas, deberías saber que CakePHP incluye
algunas por defecto. El enrutamiento en CakePHP te ofrece mucho más que cualquier otra
aplicación. Puedes acceder directamente a cualquier acción poniéndola solo en la URL. Puedes
enviar también variables a la acción a través de la URL.
Patrones de enrutamiento por defecto:
http://example.com/controller/action/param1/param2/param3
La URL /posts/view enruta hacia la accion view() del controlador PostsController y
/products/viewClearance enruta hacia la accion view_clearance() del controlador
ProductsController. Si la acción no esta definida en la URL, el método index() es asumido por
defecto.
El enrutamiento por defecto te permite enviar parámetros a la acción a través de la URL.
Una petición hacia /posts/view/25 sería equivalente a llamar a la acción view(25) en el
controlador PostsController.
Passed arguments
Los argumentos pasados son argumentos adicionales o segmentos de rutas que se usan
al hacer una solicitud. Generalmente se usan para pasar parámetros a los métodos de los
controladores.
http://localhost/calendars/view/recent/mark
En el ejemplo anterior, recent y mark son argumentos que se pasan
a CalendarsController::view(). Los argumentos pasados se dan a los controladores de tres
formas. Primero, como argumentos al método de acción llamado, segundo estan disponibles
en $this->params['pass'] como una matriz indexada numericamente. Por último, existe$this-
>passedArgs disponible de la misma manera que la segunda forma. Al utilizar rutas
personalizadas pueden pasarse ciertos parámetros junto con los argumentos pasados.
Ver ‘Pasando Argumentos a una acción’ para más información.
Argumentos del método de acción llamado
CalendarsController extends AppController{
function view($arg1, $arg2){
debug($arg1);
debug($arg2);
debug(func_get_args());
}
}
Aqui tendremos:
recent
mark
Array
(
[0] => recent
[1] => mark
)
$this->params[‘pass’] como matriz indexada numericamente
debug($this->params['pass'])
Aqui tendremos:
Array
(
[0] => recent
[1] => mark
)
$this->passedArgs como matriz indexada numericamente
debug($this->passedArgs)
Array
(
[0] => recent
[1] => mark
)
$this->passedArgs también puede contener parámentros Nombrados como una
matriz mixta con los argumentos pasados.
URL: /monkeys/jump
Enrutado: MonkeysController->jump();
URL: /products
Enrutado: ProductsController->index();
URL: /tasks/view/45
Enrutado: TasksController->view(45);
URL: /donations/view/recent/2001
Enrutado: DonationsController->view('recent', '2001');
URL: /contents/view/chapter:models/section:associations
Enrutado: ContentsController->view();
$this->passedArgs['chapter'] = 'models';
$this->passedArgs['section'] = 'associations';
Asumiendo que tu action fue definida así y quieres acceder los argumentos
usando $articleID en vez de $this->params['id'], tan solo agrega un array extra en el 3er
parámetro de Router::connect().
// some_controller.php
function view($articleID = null, $slug = null) {
// some code here...
}
// routes.php
Router::connect(
// E.g. /blog/3-CakePHP_Rocks
'/blog/:id-:slug',
array('controller' => 'blog', 'action' => 'view'),
array(
// el orden es importante ya que esto va a mapear ":id" con
$articleID en tu action
'pass' => array('id', 'slug'),
'id' => '[0-9]+'
)
);
Y ahora, gracias a la capacidad de enrutamiento inverso podrás pasar la url como se
muestra abajo y Cake sabrá como formar la URL como se definió en los routers.
// view.ctp
// esto devolverá un link a /blog/3-CakePHP_Rocks
<?php echo $html->link('CakePHP Rocks', array(
'controller' => 'blog',
'action' => 'view',
'id' => 3,
'slug' => Inflector::slug('CakePHP Rocks')
)); ?>
Prefix Routing
Muchas aplicaciones necesitan una sección administrativa donde los usuarios con
privilegios puedan hacer cambios. Con frecuencia, esto se hace con una URL especial como
/admin/users/edit/5. En CakePHP, el admin routing puede activarse dentro del archivo de
configuración del core ajustando la ruta de administración para Routing.admin.
Configure::write('Routing.admin', 'admin');
En tu controlador, será llamada cualquier acción con un prefijo admin_. Recurriendo a
nuestro ejemplo de usuarios, acceder a la URL /admin/users/edit/5 debería llamar al
método admin_edit de nuestro UsersController pasando 5 como primer parámetro.
Puedes mapear la URL /admin a tu acción admin_index del pages controller usando la
ruta
Router::connect('/admin', array('controller' => 'pages',
'action' => 'index', 'admin' => true));
Puedes configurar el Router usado múltiples prefijos:
Router::connect('/profiles/:controller/:action/*',
array('prefix' => 'profiles', 'profiles' => true));
Cualquier llamada a la sección Profiles buscaría el prefijo profiles_ en las llamadas a
los métodos. Nuestro ejemplo tendría una URL como /profiles/users/edit/5 que llamaría al
método profiles_edit en el UsersController. Es también importante recordar que usar el
HTML helper para construir tus enlaces, te ayudará a mantener las llamadas a los prefijos. He
aquí cómo construir este enlace usando el HTML helper:
echo $html->link('Edit your profile', array('profiles' => true,
'controller' => 'users', 'action' => 'edit', 'id' => 5));
Puedes ajustar múltiples rutas con prefijos usando esta metodología para crear una
estructura de URL flexible para tu aplicación.
Rutas y plugins
Las rutas a Plugins utilizan la clave plugin. Puedes crear enlaces que apunten a un
plugin siempre que añadas la clave plugin al array de la url.
echo $html->link('New todo', array('plugin' => 'todo',
'controller' => 'todo_items', 'action' => 'create'));
Por el contrario, si la petición activa es un plugin y quieres crear un enlace que no tiene
plugin, puedes hacerlo como sigue.
echo $html->link('New todo', array('plugin' => null,
'controller' => 'users', 'action' => 'profile'));
Al poner plugin => null le estás diciendo al Router que quieres crear un enlace que no
forma parte de un plugin.
Extensiones de archivo
Para manejar diferentes extensiones de archivo con tus rutas, necesitas una línea extra
en el archivo de configuración de rutas:
Router::parseExtensions('html', 'rss');
Esto le dirá al router que retire las extensiones de archivo coincidentes y que procese
entonces el resto..
Si quieres crear una url como /page/title-of-page.html podrías crear tu ruta como se
explica a continuación:
Router::connect(
'/page/:title',
array('controller' => 'pages', 'action' => 'view'),
array(
'pass' => array('title')
)
);
Para crear enlaces que se mapeen a esas rutas simplemente usamos:
$html->link('Link title', array('controller' => 'pages',
'action' => 'view', 'title' => Inflector::slug('text to slug', '-'),
'ext' => 'html'))
Inflexiones Propias
Controladores
# /app/controllers/recetas_controller.php
function buscar($query) {
//la lógica de la acción va aqui...
}
}
?>
Para que puedas usar un controlador de manera productiva en tu propia aplicación,
repasaremos algunos de los atributos y métodos provistos por los controladores de CakePHP.
The App Controller
El núcleo de CakePHP viene con un controlador por defecto llamado the Pages
Controller (el Controlador de Páginas) (cake/libs/controller/pages_controller.php). La página de
inicio que ves luego de la instalación, es generada utilizando este controlador. Por ejemplo: Sí
creas un archivo de vista app/views/pages/about_us.ctp puedes accesarlo utilizando la
url http://example.com/pages/about_us
Cuando “cocinas” una aplicación utilizando la consola de CakePHP el controlador de
páginas es copiado a tu carpeta app/controllers/ y puedes modificarla a tus necesidades si es
necesario. O simplemente puedes copiar el archivo page_controller.php del núcleo a tu app.
No modifiques directamente NINGUN archivo dentro de la carpeta cake para evitar
problemas futuros en la actualización del núcleo
$name
Los usuarios de PHP4 deberían empezar la definición de sus controladores con el
atributo $name. Este atributo debería ser asignado con el nombre del controlador. Usualmente
este es simplemente el plural del modelo principal al que el controlador está asociado. Esto
previene algunos problemas de distinción de mayúsculas que tiene PHP4 para los nombres de las
clases.
<?php
?>
Existen unos pocos atributos en los controladores de CakePHP que te dan control sobre
cómo se colocan tus vistas (views ) dentro del diseño (layout).
Al atributo $layout se le puede asignar el nombre de un diseño (layout) guardado
en /app/views/layouts. Especificas un diseño al igualar $layout al nombre del archivo con el
diseño excluyendo la extensión .ctp. Si este atributo no ha sido definido, CakePHP renderiza el
diseño por defecto, default.ctp. Si no has definido un diseño
en /app/views/layouts/default.ctp, el diseño por defecto del núcleo de CakePHP’s será
renderizado.
<?php
?>
También puedes cambiar el título de la página (que está localizado en la barra en la
parte superior de tu navegador) utilizando $pageTitle . Para que esto funcione apropiadamente,
tu diseño (layout) necesita incluir la variable $title_for_layout como mínimo entre las
etiquetas <title> y </title> en la cabecera del documento HTML.
<?php
?>
También puedes establecer el título desde la vista (view) usando $this-
>pageTitle (Has de incluir la parte $this->; se recomienda, ya que separa la lógica del diseño y
el contenido). Para una página estática has de usar $this->pageTitleen la vista si quieres un
título personalizado.
Si $this->pageTitle no está establecido, se generará automáticamente un título basado
en el nombre del controlador, o el nombre del fichero de la vista en el caso de una página
estática.
Otros Atributos
Aunque puedes ojear todos los detalles para todos los atributos del controlador en el
API, hay otros atributos del controlador que merecen sus propias secciones en el manual.
El atributo $cacheAction ayuda en el “cacheado” (caching ) de vistas (views), y el
atributo $paginate es usado para establecer las opciones por defecto de paginado para el
controlador. Para más información sobre cómo utilizar esos atributos, écha un vistazo a sus
respectivas secciones más adelante en este manual.
persistModel
Para una lista completa de los métodos del controlador y sus descripciones visita el API
de CakePHP. Echa un vistazo ahttps://api.cakephp.org/class/controller .
set
set(string $variable, mixed $valor)
El método set() es la principal manera de enviar datos desde tu controlador a tu
vista (view). Una vez que has utilizado set(), la variable puede ser accedida en tu vista.
<?php
$this->set('color', 'azul');
$data = array(
'color' => 'pink',
'type' => 'sugar',
'base_price' => 23.95
);
$this->set($data);
?>
render
render(string $action, string $layout, string $file)
El método render() es llamado automáticamente al final de cada acción de
controlador pedida. Este método lleva a cabo toda la lógica de la vista (usando los datos
que has proporcionado con el método set()), coloca la vista (view) dentro de su diseño
(layout) y lo sirve de vuelta al usuario final.
El fichero de vista por defecto utilizado por render es determinado por convenio.
Por ejemplo, si se pide la acción search() del controlador RecipesController, será
renderizado el fichero de vista en /app/views/recipes/search.ctp.
class RecipesController extends AppController {
function search() {
// Render the view in /views/recipes/search.ctp
$this->render();
}
...
}
A pesar de que CakePHP lo llamará automáticamente (a menos que hayas
establecido $this->autoRender a falso) después de cada lógica de las acciones, puedes
utilizar render para especificar un fichero de vista alternativo indicando un nombre de
acción en el controlador usando $action.
Si $action comienza por ‘/’ se asume que es un fichero de vista o elemento relativo
a la carpeta /app/views. Esto permite el renderizado inmediato de elementos, algo muy útil
en las llamadas ajax.
// Render the element in /views/elements/ajaxreturn.ctp
$this->render('/elements/ajaxreturn');
También puedes especificar un fichero de vista alternativo usando el tercer
parámetro, $file. Cuando estés usando $file, no olvides utilizar unas pocas de las
constantes globales de CakePHP (como VIEWS).
El parámetro $layout te permite especificar el diseño en el que la vista es
renderizada.
Renderizando una vista específica
En tu controlador podrías querer renderizar una vista de otra manera de la que
normalmente se haría. Puedes hacer esto llamando a render() directamente. Una vez que
llamaste a render() CakePHP no tratará de re-renderizar la vista.
class PostsController extends AppController {
function my_action() {
$this->render('custom_file');
}
}
Esto renderizará app/views/posts/custom_file.ctp en vez
de app/views/posts/my_action.ctp
Control de Flujo
redirect
redirect(string $url, integer $status, boolean $exit)
El método de control de flujo que más frecuentemente utilizarás es redirect().
Este método toma su primer parámetro en forma de URL relativa de CakePHP. Por
ejemplo, cuando un usuario ha hecho un pedido satisfactoriamente, probablemente
desearás redirigirle a una ventana de recibo.
function realizarPedidos() {
Retrollamadas (“Callbacks”)
constructClasses
Este método carga los modelos requeridos por el controlador. El proceso de carga
es realizado por CakePHP normalmente, pero hay que tener a mano este método cuando
se accede a los controladores desde una perspectiva diferente. Si necesitas CakePHP en
un script de línea de comando o algún otro uso externo, constructClasses() será útil.
referer
Devuelve la URL remitente de la petición actual. Ver `referer
<https://en.wikipedia.org/wiki/Referer>`_ en la wikipedia para más información.
disableCache
Usado para indicarle al navegador del usuario que no guarde en caché los
resultados de la petición actual. Esto es diferente que guardar en caché una vista (view
caching), tratado en un capítulo posterior.
postConditions
postConditions(array $datos, mixed $operadores, string $bool, boolean $exc
lusivo)
Usa este método para convertir un conjunto de datos de modelo recibidor mediante
POST (de inputs compatibles con HtmlHelper) en un conjunto de condiciones de búsqueda
para un modelo. Esta función ofrece un atajo rápido para la construcción de la lógica de
búqueda. Por ejemplo, un usuario administrativo puede querer buscar pedidos para saber
qué elementos necesitan ser enviados. Puedes utilizar los
ayudantes FormHelper y HtmlHelper para crear un formulario rápido basado en el modelo
Pedido. Entonces, una acción de un controlador puede usar los datos recibidos desde ese
formulario para encauzar las condiciones de búsqueda:
function index() {
$o = $this->Pedidos->findAll($this->postConditions($this-
>data));
$this->set('pedidos', $o);
}
Si $this->data[‘Pedido’][‘destino’] es igual a “Old Towne Bakery”, postConditions
convierte esa condición en un array compatible para ser usado en un método Model-
>findAll(). En este caso, array(“pedido.destino” => “Old TowneBakery”) .
$comments = $this->requestAction('/comments/latest');
foreach($comments as $comment) {
echo $comment['Comment']['title'];
}
Podemos colocar esos elementos en cualquier sitio para obtener la salida usando:
echo $this->element('latest_comments');
Escrito de esta manera, siempre que el elemento sea renderizado, se realizará una
petición al controlador para obtener los datos, los datos serán procesados y devueltos. De
todos modos, de acuerdo con el aviso anterior, es mejor utilizar caché de elementos para
prevenir procesamiento innecesario. Modificando la llamada a element para que se vea así:
echo $this->element('latest_comments', array('cache'=>'+1
hour'));
La llamada a requestAction no se realizará mientras que la el archivo de la vista
del elemento en cache exista y sea válido.
Además, requestAction ahora toma urls con estilo cake basadas en arrays:
echo $this->requestAction(
array(
'controller' => 'articles',
'action' => 'featured'
),
array('return')
);
Esto permite a la llamada a requestAction evitar el uso de Router::url lo que
puede incrementar el rendimiento. Las urls basadas en arrays son las mismas que las
que HtmlHelper:link usa, con una diferencia. Si estás usando parámetros con nombre en
tu url, entonces el array de url debe envolver los parámetros con nombre en la clave
‘named’. Esto es porque requestAction sólo combina los argumentos nombrados del array
en el array de miembros deController::params y no coloca los argumentos con nombre en
la clave ‘named’.
echo $this->requestAction('/articles/featured/limit:3');
Este, como array en requestAction debería ser:
echo $this->requestAction(
array(
'controller' => 'articles',
'action' => 'featured',
'named' => array(
'limit' => 3
)
)
);
A diferencia de otros lugares donde las urls de arrays son análogas a urls de
cadenas, requestAction las trata de manera diferente.
Cuando utilices una url de array junto con requestAction() has de
especificar todos los parámetros que necesitarás en la acción pedida. Esto incluye
parámetros como $this->data y $this->params['form']
loadModel
loadModel(string $modelClass, mixed $id)
La función loadModel es útil cuando se necesita usar un modelo que no es
propiamente el modelo por defecto del controlador o uno de sus modelos asociados.
$this->loadModel('Article');
$recentArticles = $this->Article->find('all', array('limit' =>
5, 'order' => 'Article.created DESC'));
$this->loadModel('User', 2);
$user = $this->User->read();
4. Conclusiones
Dado los datos obtenido podemos concluir que tanto ORM y Entity Framework son
muy útiles dado las facilidades que tienen cada uno para el desarrollo, aunque hay que tomar
en cuenta los beneficios que nos da y también sus perjuicios dado que de eso depende la
programación a desarrollar.
5. Recomendaciones
Las recomendaciones a tomar serian introducirse más en los temas de consulta para
facilitar los desarrollos de aplicaciones, ya que sería un beneficio tanto para nosotros como
desarrolladores como para la comunidad a la que vayamos a brindar el servicio.
Contenido
1. Introducción ............................................................................................................... 2
2. Objetivos .................................................................................................................... 2
Beneficios ...................................................................................................................... 5
Requerimientos .............................................................................................................. 6
Permisos ......................................................................................................................... 7
Instalación ...................................................................................................................... 7
Desarrollo ...................................................................................................................... 8
Producción ..................................................................................................................... 8
Enciéndelo ................................................................................................................... 19
Prefix Routing.............................................................................................................. 38
Controladores ............................................................................................................... 41
persistModel ................................................................................................................ 49
4. Conclusiones ............................................................................................................ 59
5. Recomendaciones .................................................................................................... 59
6. Figuras...................................................................................................................... 62
7. Bibliografía .............................................................................................................. 62
6. Figuras
Figura 1 MVC .................................................................................................................... 4
7. Bibliografía
https://book.cakephp.org/. (s.f.). Obtenido de https://book.cakephp.org/:
https://book.cakephp.org/1.3/es/The-Manual/Beginning-With-CakePHP/What-is-
CakePHP-Why-Use-it.html
https://book.cakephp.org/. (s.f.). Obtenido de https://book.cakephp.org/:
https://book.cakephp.org/1.3/es/The-Manual/Beginning-With-CakePHP/Understanding-
Model-View-Controller.html