Instalación

Instalar CakePHP puede ser tan simple como colocar el directorio en el servidor, o tan complejo y flexible como necesites. Esta sección cubrirá los tres tipos principales de instalación para CakePHP: desarrollo, producción y avanzado

  • Desarrollo: fácil para iniciar, los URL de la aplicación incluyen el nombre del directorio, y es menos seguro.
  • Producción: Requiere la capacidad de configurar el servidor web para definir el “document root”, muy seguro.
  • Avanzado: Con cierta configuración, permite ubicar los directorios clave de CakePHP en diferentes partes del sistema de archivos, para compartir una misma instalación de CakePHP para varias aplicaciones.

Desarrollo

Usar una instalación de desarrollo es el método más rápido para montar Cake. Este ejemplo te ayudará a instalar una aplicación de CakePHP y hacerla disponible en http://www.ejemplo.com/cake_1_2/. Asumimos para el fin de este ejemplo que tu raíz de documentos está establecido a /var/www/html.

Descomprime los contenidos del archivo Cake en /var/www/html. Ahora tienes una carpeta en tu raíz de documentos con un nombre dependiente de la versión que te has descargado (p.ej. cake_1.2.0.7962). Renombra esta carpeta a cake_1_2. Tu configuración de desarrollo será como la siguiente en el sistema de archivos:

/var/www/html

cake_1_2

  • /app
  • /cake
  • /vendors
  • .htaccess
  • /index.php
  • README

Si tu servidor web está configurado correctamente, deberías encontrar tu aplicación de Cake accesible en http://www.ejemplo.com/cake_1_2/.

Producción

Una instalación de producción es una manera más flexible de instalar Cake. Usar este método permite que un dominio entero se comporte como una aplicación CakePHP única. Este ejemplo te ayudará a installar Cake en cualquier sitio de tu sistema de ficheros y ponerlo disponible en http://www.ejemplo.com. Tener en cuenta que esta instalación puede requerir los privilegios para cambiar el DocumentRoot (raíz de documentos) en servidores web Apache.

Descomprime los contenidos del archivo Cake en un directorio a tu elección. Por motivos de ejemplo, asumimos que escoges instalar Cake en /cake_install. Tu configuración de producción se verá de la siguiente manera en el sistema de ficheros:

  • /cake_install/
    • /app
      • /webroot (este directorio es el establecido con la directiva DocumentRoot)
    • /cake
    • /vendors
    • /.htaccess
    • /index.php
    • /README

Los desarrolladores que usan Apache deberán establecer la directiva DocumentRoot para el dominio a:

DocumentRoot /cake_install/app/webroot

Si tu servidor web está configurado correctamente, deberías encontrar tu aplicación Cake accesible en http://www.ejemplo.com.

Instalación Avanzada

Existen situaciones en las que querrás colocar los directorios de CakePHP en lugares diferentes del sistema de archivos. Esto puede ser debido a restricciones de un servidor compartido, o quizás simplemente deseas que algunas de tus aplicaciones compartan las mismas librerías de Cake. Esta sección describe cómo esparcir los directorios de CakePHP sobre un sistema de archivos.

En primer lugar, date cuenta que existen tres partes principales de una aplicación Cake:

  1. Las librerías principales(core) de CakePHP, en /cake.
  2. El código de tu aplicación, en /app.
  3. El webroot de la aplicación, normalmente en /app/webroot.

Cada uno de estos directorios puede ser ubicado en cualquier lugar de tu sistema de archivos, a excepción del webroot, que debe ser accesible por el servidor web. Incluso puedes mover el directorio webroot fuera de tu carpeta app siempre que le indiques a Cake en donde lo has puesto.

Para configurar tu instalación de Cake, necesitarás hacer algunos cambios a /app/webroot/index.php. Hay tres constantes que deberás editar: ROOT, APP_DIR, y CAKE_CORE_INCLUDE_PATH.

  • ROOT debe contener la ruta del directorio que contiene la carpeta app (es decir, el padre de APP_DIR).
  • APP_DIR debe ser establecida con el nombre(base) de tu carpeta app.
  • CAKE_CORE_INCLUDE_PATH debe contener la ruta al directorio que contiene las librerías de Cake.

Vamos a mostrar un ejemplo para ver cómo quedaría una instalación avanzada en la práctica. Imagina que quiero configurar CakePHP para que funcione de esta manera:

  • Las Librerías de CakePHP serán ubicadas en /usr/lib/cake.
  • El webroot de mi aplicación será /var/www/misitio/.
  • El directorio app de mi aplicación estará en /home/yo/misitio.

Dada esta configuración, necesitaré editar mi webroot/index.php (el cual terminará ubicado en /var/www/misitio/index.php, en este ejemplo) para que sea así:

// /app/webroot/index.php (codigo parcial, sin comentarios)

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

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

if (!defined('CAKE_CORE_INCLUDE_PATH')) {
    define('CAKE_CORE_INCLUDE_PATH', DS.'usr'.DS.'lib');
}

Es recomendable utilizar la constante DS en lugar de barras inclinadas para delimitar las rutas de los archivos. Esto evita errores por falta de archivo como resultado de usar el delimitador equivocado, y además hace tu código más portable.

Rutas de Clase Adicionales

Ocasionalmente es útil compartir clases MVC entre aplicaciones en el mismo sistema. Si quieres el mismo controler en dos aplicaciones, puedes usar el archivo bootstrap.php de CakePHP para traer estas clases adicionales a la escena.

En el archivo bootstrap.php, define algunas variables especiales para que CakePHP sepa otros lugares en donde buscar clases MVC:

$viewPaths        = array();
$controllerPaths  = array();
$modelPaths       = array();
$helperPaths      = array();
$componentPaths   = array();
$behaviorPaths    = array();
$pluginPaths      = array();
$vendorPaths      = array();
$localePaths      = array();
$shellPaths       = array();

Cada una de estas variables especiales pude ser establecida a un array de rutas absolutas en el sistema de archivos donde las clases adicionales pueden ser encontradas cuando se solicite. Asegúrate que cada ruta contenga una barra inclinada (o preferiblemente la constante DS) al final.

Apache y mod_rewrite (y .htaccess)

A pesar de que CakePHP está hecho para funcionar con mod_rewrite sin tocar nada, y normalmente así es, hemos notado que algunos usuarios tienen dificultades para lograr que todo funcione correctamente en sus sistemas.

Aquí hay unas cuantas cosas que puedes probar para conseguir que funcione correctamente. Primero mira en tu httpd.conf (asegúrate de estar editando el httpd.conf del sistema y que no es httpd.conf específico de un usuario o del site).

  1. 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>
    
  2. 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.

  3. Asegúrate de que tu copia de CakePHP es de las sección de descargas de nuestro site o nuestro repositorio GIT, y que ha sido desempaquetado correctamente verificando que existen los ficheros .htaccess:

    En el directorio raíz de Cake (necesita ser copiado al directorio, esto redirige todo a tu aplicación de Cake):

    <IfModule mod_rewrite.c>
       RewriteEngine on
       RewriteRule    ^$ app/webroot/    [L]
       RewriteRule    (.*) app/webroot/$1 [L]
    </IfModule>
    

    En el directorio app de Cake (será copiado por bake):

    <IfModule mod_rewrite.c>
        RewriteEngine on
        RewriteRule    ^$    webroot/    [L]
        RewriteRule    (.*) webroot/$1    [L]
     </IfModule>
    

    En el directorio webroot de Cake (será copiado a tu webroot de la aplicación por bake):

    <IfModule mod_rewrite.c>
        RewriteEngine On
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
    </IfModule>
    

    En muchos servicios de hosting (GoDaddy, 1and1), tu servidor web está realmente siendo servido desde un directorio de usuario que ya utiliza mod_rewrite. Si estás instalando CakePHP en un directorio de usuario (http://ejemplo.com/~nombreusuario/cakephp), o en cualquier otra estructura que ya utilice mod_rewrite necesitarás añadir sentencias RewriteBase a los archivos .htaccess que utiliza CakePHP (/.htaccess, /app/.htaccess, /app/webroot/.htaccess)

    Esto puede ser añadido a la misma sección con la directiva RewriteEngine, así, por ejmplo, tu archivo .htaccess en el webroot devería ser así:

    <IfModule mod_rewrite.c>
        RewriteEngine On
        RewriteBase /
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
    </IfModule>
    

    Los detalles de esos cambios dependen de tu configuración, y pueden incluir cosas adicionales que no están relacionadas con Cake. Consulta la documentación online de Apache para más información.

Lighttpd y mod_magnet

Aunque Lighttpd cuenta con un módulo de reescritura, no es equivalente al mod_rewrite de Apache. Las funcinalidades completas de mod_rewrite se reparten entre el mod_rewrite de Lighttp, el mod_magnet y el mod_proxy.

Sin embargo, CakePHP, mayoritariamente necesita mod_magnet para redirigir las solicitudes a fin de trabajar con bastantes URLs

Para utilizar bastantes URLs con CakePHP y Lighttp, sustituye este lua script en /etc/lighttpd/cake.

-- pequeña funcion helper
function file_exists(path)
  local attr = lighty.stat(path)
  if (attr) then
      return true
  else
      return false
  end
end
function removePrefix(str, prefix)
  return str:sub(1,#prefix+1) == prefix.."/" and str:sub(#prefix+2)
end

-- prefijo sin la barra
local prefix = ''

-- la magia ;)
if (not file_exists(lighty.env["physical.path"])) then
    -- fichero aún desaparecido, pasarlo al fastcgi Backend
    request_uri = removePrefix(lighty.env["uri.path"], prefix)
    if request_uri then
      lighty.env["uri.path"]          = prefix .. "/index.php"
      local uriquery = lighty.env["uri.query"] or ""
      lighty.env["uri.query"] = uriquery .. (uriquery ~= "" and "&" or "") .. "url=" .. request_uri
      lighty.env["physical.rel-path"] = lighty.env["uri.path"]
      lighty.env["request.orig-uri"]  = lighty.env["request.uri"]
      lighty.env["physical.path"]     = lighty.env["physical.doc-root"] .. lighty.env["physical.rel-path"]
    end
end
-- fallthrough pondrá de nuevo la solucititud en el bucle lighty
-- eso significa que tenemos la manipulación 304 de forma gratuita. ;)

If you run your CakePHP installation from a subdirectory, you must set prefix = ‘subdirectory_name’ in the above script.

Then tell Lighttpd about your vhost:

$HTTP["host"] =~ "example.com" {
        server.error-handler-404  = "/index.php"

        magnet.attract-physical-path-to = ( "/etc/lighttpd/cake.lua" )

        server.document-root = "/var/www/cake-1.2/app/webroot/"

        # además piensa como coger los ficheros vim tmp fuera
        url.access-deny = (
                "~", ".inc", ".sh", "sql", ".sql", ".tpl.php",
                ".xtmpl", "Entries", "Repository", "Root",
                ".ctp", "empty"
        )
}

Pretty URLs en nginx

nginx es un servidor popular que, del mismo modo que Lighttpd, consume menos recursos del sistema. Su inconveniente es que no utiliza ficheros .htaccess como Apache y Lighttpd, por lo que es necesario crear esas reescrituras de URLs en la configuración de site-available. Dependiendo de tu configuración, necesitarás modificar esto, pero como mínimo necesitarás que PHP se ejecute como instancia de FastCGI.

server {
    listen   80;
    server_name www.ejemplo.com;
    rewrite ^(.*) http://ejemplo.com$1 permanent;
}

server {
    listen   80;
    server_name ejemplo.com;

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

    location / {
        root   /var/www/ejemplo.com/public/app/webroot/;
        index  index.php index.html index.htm;
        if (-f $request_filename) {
            break;
        }
        if (-d $request_filename) {
            break;
        }
        rewrite ^(.+)$ /index.php?q=$1 last;
    }

    location ~ .*\.php[345]?$ {
        include /etc/nginx/fcgi.conf;
        fastcgi_pass    127.0.0.1:10005;
        fastcgi_index   index.php;
        fastcgi_param SCRIPT_FILENAME /var/www/ejemplo.com/public/app/webroot$fastcgi_script_name;
    }
}

URL Rewrites on IIS7 (Windows hosts)

IIS7 no tiene soporte nativo para archivos .htaccess. Aunque hay agregados que proporcionan ese soporte, también pueden importarse las reglas htacess en IIS para usar las reescritura nativa de CakePHP. Para hacer esto, siga los siguientes pasos:

  1. Use el Instalador de Plataforma Web de Microsoft para instalar el Módulo URL Rewrite 2.0.
  2. Crear un nuevo archivo en el folder de CakePHP llamado web.config
  3. Usando Notepad u otro editor XML-seguro, copiar el siguiente código en el archivo web.config recién creado.
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <rewrite>
            <rules>
            <rule name="Redirect static resources" stopProcessing="true">
            <match url="^(ico|img|css|files|js)(.*)$" />
            <action type="Rewrite" url="app/webroot/{R:1}{R:2}" appendQueryString="false" />
            </rule>
            <rule name="Imported Rule 1" stopProcessing="true">
            <match url="^(.*)$" ignoreCase="false" />
            <conditions logicalGrouping="MatchAll">
                        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
                        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
            </conditions>
            <action type="Rewrite" url="index.php?url={R:1}" appendQueryString="true" />
            </rule>
            <rule name="Imported Rule 2" stopProcessing="true">
              <match url="^$" ignoreCase="false" />
              <action type="Rewrite" url="/" />
            </rule>
            <rule name="Imported Rule 3" stopProcessing="true">
              <match url="(.*)" ignoreCase="false" />
              <action type="Rewrite" url="/{R:1}" />
            </rule>
            <rule name="Imported Rule 4" stopProcessing="true">
              <match url="^(.*)$" ignoreCase="false" />
              <conditions logicalGrouping="MatchAll">
                        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
                        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
              </conditions>
              <action type="Rewrite" url="index.php?url={R:1}" appendQueryString="true" />
            </rule>
            </rules>
        </rewrite>
    </system.webServer>
</configuration>

También es posible usar la funcionalidad Import en el módulo URL Rewrite de IIS para importar reglas directamente del archivo .htaccess de CakePHP’s en root, /app/, and /app/webroot/ - aunque puede ser necesaria alguna edición para lograr que funcionen. Cuando se importan las reglas de esta manera, IIS automáticamente creará el archivo web.config para nosotros.

Una vez que se cree el archivo web.config con las reglas de reescritura aceptadas por IIS, los vínculos, css, js y redireccionamiento en CakePHP deben funcionar correctamente.

Enciéndelo

Muy bien, ahora veamos a CakePHP en acción. Dependiendo de la configuración que hayas usado, deberías apuntar tu navegador a http://example.com/ o http://example.com/mi_aplicacion/. En este punto, se te presentará la vista de bienvenida de CakePHP por omisión, y un mensaje que indica el estado de conexión con la base de datos.

¡Felicidades! Ya estás listo para crear tu primera aplicación CakePHP