Instalação

Instalando o CakePHP pode ser feito simplesmente descompactando o conteúdo no seu servidor web ou de forma mais complexa e flexível, do jeito que você preferir. Esta seção vais falar de três maneiras de instalar o CakePHP: desenvolvimento, produção e avançada.

  • Desenvolvimento: fácil para começar, URL dos seus aplicativos incluem o diretório de instalação do CakePHP e é menos seguro;

  • Produção: Requer maior habilidade para configurar o servidor web, porém mais seguro e com URLs mais amigáveis;

  • Avançada: Com algumas configurações, permite você colocar os diretórios do CakePHP em diferentes locais do sistema, possibilitando compartilhar o núcleo do CakePHP entre diversas aplicações.

Desenvolvimento

Apenas coloque seus arquivos do CakePHP no diretório público do seu servidor web (normalmente htdocs, www, public_html). Por exemplo, assumindo que o diretório público do seu servidor web seja /var/www/html, os arquivos devem ficar desta maneira:

  • /var/www/html

    • /cake_1_2

      • /app

      • /cake

      • /vendors

      • /.htaccess

      • /index.php

      • /README

Para ver a sua aplicação CakePHP, entre no link http://www.exemplo.com/cake_1_2/.

Produção

A instalação de produção é a forma mais flexível de configurar o Cake. Usar este método permite um total domínio para agir como uma única aplicação CakePHP. Este exemplo irá ajudá-lo a instalar o Cake em qualquer lugar no seu sistema de arquivos e torná-lo disponível em http://www.example.com. Note que esta instalação pode requerer os privilégios para alteração do DocumentRoot em um servidor Apache.

Descompacte o conteúdo do arquivo do Cake em um diretório de sua escolha. Para os fins deste exemplo, assumimos que você escolheu instalar o Cake em /cake_install. Sua configuração de produção será semelhante a essa no sistema de arquivos:

/cake_install/

/app

  • /webroot (this directory is set as the DocumentRoot directive)

/cake

/vendors

/.htaccess

/index.php

/README

Desenvolvedores usando o Apache devem definir a diretiva DocumentRoot para o domínio:

DocumentRoot/cake_install/app/webroot

Se seu servidor web está configurado corretamente, você deve encontrar agora a sua aplicação Cake acessível em http://www.example.com.

Instalação avançada

Aqui estão algumas situações que você escolhe o lugar onde os diretórios do CakePHP vão ficar no seu sistema. Isto pode ser por causa de uma restrição do sistema ou para compartilhar as bibliotecas entre diferentes aplicações. Esta seção descreve como espalhar seus diretórios dos CakePHP no sistema.

Primeiro, note que há três partes principais da sua aplicação CakePHP:

  1. As bibliotecas do núcleo do CakePHP, em /cake;

  2. O código da sua aplicação, em /app;

  3. Os arquivos públicos da sua aplicação, normalmente em /app/webroot.

Cada um desses diretórios pode ser colocado em qualquer lugar do seu sistema, com exceção do webroot, que precisa estar acessivel pelo servidor web. Você pode mover a pasta webroot para fora do diretório da sua aplicação (app), desde que informe ao Cake onde você vai colocá-la.

Para configurar sua instalação do Cake, nós vamos ter que fazer algumas alterações no arquivo /app/webroot/index.php. Aqui existem três constantes que precisaremos editar: ROOT, APP_DIR e CAKE_CORE_INCLUDE_PATH.

  • ROOT deve ser configurada para informar o diretório onde sua aplicação se encontra, ou seja, onde está a pasta app;

  • APP_DIR deve ser configurada para informar qual a pasta app;

  • CAKE_CORE_INCLUDE_PATH deve ser configurada para informar o diretório onde estão as bibliotecas do CakePHP (a pasta cake).

Vamos fazer um exemplo para que você veja como funciona a instalação avançada na prática. Imagine que eu quero que a aplicação funcione como segue:

  • As bibliotecas do CakePHP deverão ser colocadas em /usr/lib/cake;

  • O diretório público da minha aplicação (webroot) deve ser em /var/www/minhaapp;

  • O diretório da aplicação deve ser /home/eu/minhaapp.

Com estas configurações, eu preciso editar o meu arquivo webroot/index.php (que no final deve estar em /var/www/meusite/index.php, neste exemplo) e ver o seguinte:

// /app/webroot/index.php (parcialmente, comentários removidos)

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

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

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

É recomendado que você use a constante DS no lugar das barras para entre os diretórios. Isso previne que não cause erro quando se use a aplicação em sistemas operacionais diferentes, tornando seu código mais portável.

Caminhos adicionais para classes

Em algumas ocasiões é interessante você compartilhar as classes do MVC entre as aplicações no mesmo sistema. Se você quer um mesmo controlador para mesma aplicação, você pode usar o arquivo bootstrap.php do CakePHP para adicionar estas classes adicionais.

No bootstrap.php, defina algumas variáveis com nomes especiais para fazer com que o CakePHP olhe nestes diretórios a procura da sua classe:

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

Cada um dessas variáveis especiais pode ser um conjunto na array com o diretório absoluto onde estão as classes que você desejar. Tenha certeza que cada diretório especificado inclua as barras com DS.

Apache e mod_rewrite

O CakePHP é construido para trabalhar com o mod_rewrite, mas vimos muitos usuários apanharem para conseguir fazer isto funcionar nos seus sistemas, então nós lhe daremos algumas dicas que você pode tentar fazer para rodar corretamente.

Aqui estão algumas coisas que você pode tentar para rodar corretamente. Primeiro veja o seu httpd.conf (tenha certeza que você está editando o httpd.conf do sistema ao invés do httpd.conf de um usuário ou site).

  1. Tenha certeza que o override do .htaccess está sendo permitido, ou seja, que AllowOverride está setado para All no DocumentRoot correto. Você deve ver algo similar a:

    #
    # Cada diretório que o Apache tenha acesso pode ser configurado com relação
    # a serviços e funcionalidades que são permitidos e/ou desabilitados neste
    # diretório (e seus subdiretórios).
    #
    # Primeiro nós configuramos o "default" para ter um grupo restrito de
    # recursos.
    #
    <Directory />
        Options FollowSymLinks
        AllowOverride All
    #    Order deny,allow
    #    Deny from all
    </Directory>
    
  2. Tenha certeza que está carregando o mod_rewrite corretamente. Você deve ver algo como:

    LoadModule rewrite_module libexec/apache2/mod_rewrite.so
    

    Em muitos sistemas isto estará comentado (começando com uma #) por padrão, então você deve remover a cerquilha (simbolo #).

    Depois de fazer as suas alterações, reinicie o Apache para ter certeza que suas configurações estão ativas.

    Verifique que seu .htaccess estão nos diretório corretos.

    Isto pode não acontecer durante a copia, pois alguns sistemas operacionais tratam arquivos começados com “.” como ocultos e consequentemente não copiam.

  3. Tenha certeza que sua cópia do CakePHP é da sessão de downloads do site ou nosso repositório SVN e tenha sido descompactado corretamente verificando pelo arquivo .htaccess.

    Na raiz (que será copiada para seu document, isso redirecionará qualquer coisa para sua aplicação Cake):

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

    O diretório app (que será copiado para o topo do diretório pelo bake):

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

    No diretório webroot (que será copiado para a raiz da aplicação web pelo bake):

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

    Para muitos servidores de hospedagem (GoDaddy, 1and1), seu servidor web já possui o mod_rewrite habilitado. Se você está instalando o CakePHP dentro do diretório do usuário (http://exemplo.com.br/~username/cakephp/) ou qualquer estrutura de URL que já utiliza o mod_rewrite, você precisa incluir a tag RewriteBase nos seus .htaccess (/.htaccess, /app/.htaccess, /app/webroot/.htaccess).

    Isso pode ser adicionado na mesma sessão que o RewriteEngine, como por exemplo no .htaccess do webroot:

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

    Os detalhes dessa alteraçãoa dependem da sua instalação e podem incluir outras informação que não estão relacionadas com o CakePHP. Veja a documentação do Apache para mais informações.

Lighttpd e mod_magnet

Embora Lighttpd suporte o módulo de rewrite, ele não é equivalente ao módulo mod_rewrite do Apache. Todas as funcionalidades do mod_rewrite no Lighttpd estão espalhadas entre os módulos mod_rewrite, mod_magnet e mod_proxy.

CakePHP, entretanto, precisa principalmente do mod_magnet para redirecionar requests para funcionar com URLs amigáveis.

Para usar URLs amigáveis com CakePHP e Lighttpd, coloque o script lua abaixo em /etc/lighttpd/cake.

-- pequena função auxiliar
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

-- prefixo sem a barra
local prefix = ''

-- a mágica ;]
if (not file_exists(lighty.env["physical.path"])) then
    -- arquivo ainda está faltando. passe para o backend fastcgi
    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 vai colocar ele de volta no loop de request do lighty
-- isso quer dizer que nós ganhamos o tratamento do 304 de graça. ;]

Se você roda seu CakePHP de um sub-diretório, você precisa usar prefix = “subdirectory_name” no script acima.

Agora informe Lighttpd sobre seu 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/"

        # Think about getting vim tmp files out of the way too
        url.access-deny = (
                "~", ".inc", ".sh", "sql", ".sql", ".tpl.php",
                ".xtmpl", "Entries", "Repository", "Root",
                ".ctp", "empty"
        )
}

URLs agradáveis no nginx

nginx é um servidor popular que, como Lighttpd, usa menos recursos do sistema. Seu inconveniente é que não faz uso de arquivos .htaccess como Apache e Lighttpd, por isso é necessário para criar essas URLs reescritos na configuração do site disponível. Dependendo da sua instalação, você terá que modificar isso, no mínimo, você vai precisar que o PHP seja executado como um FastCGI.

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

server {
    listen   80;
    server_name example.com;

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

    location / {
        root   /var/www/example.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/example.com/public/app/webroot$fastcgi_script_name;
    }
}

Comece agora!

Tudo bem, vamos ver o CakePHP em ação. Dependendo de qual opção de instalação você utilizou, acesse no seu browser o link http://exemplo.com.br ou http://exemplo.com.br/cake_instalado/. Neste ponto, você verá a página padrão do CakePHP e a mensagem do estado da configuração do seu banco de dados.

Parabéns! Você já pode criar sua primeira aplicação CakePHP.