CakePHP com Composer

No último post eu mostrei rapidamente como o CakePHP facilita a vida do programador. Mas o modo que eu mostrei realmente não é o mais adequado para quem quer fazer alguma coisa mais séria. Nesse post eu pretendo mostrar como é possível utilizar o CakePHP com o gerenciador de dependências Composer.

ESTE É UM POST ANTIGO

Este post foi importado do antigo blog e o seu conteúdo não foi revisado. O conteúdo deve estar desatualizado e a formatação pode apresentar problemas.

Composer + CakePHP

Composer

Se você nunca utilizou o Composer, recomendo que você primeiro leia a documentação oficial para saber como ele funciona. Mas de forma muito resumida eu posso dizer: você configura as dependências do seu projeto em um arquivo composer.json e o script do Composer irá se encarregar de instalar tudo o que for necessário.

Para começar, é necessário instalar o Composer. E isso pode ser tão simples quanto uma ou duas linhas de comandos, você escolhe:

Terminal

$ curl -sS https://getcomposer.org/installer | php
$ sudo mv composer.phar /usr/local/bin/composer # COMANDO OPCIONAL

Se você executar o segundo comando, que é opcional, o comando do composer ficará acessível de qualquer lugar do sistema (o que pode ou não ser uma boa ideia, você quem sabe). Para esse post, eu vou utilizar o Composer instalado globalmente (executando o segundo comando).

composer.json

Para começar, precisamos criar um arquivo composer.json. O composer possui um comando interativo, que vai “montando” o arquivo conforme respostas inseridas no terminal (informações digitadas em cor azul):

Terminal

$ composer init

Welcome to the Composer config generator

This command will guide you through creating your composer.json config.

Package name (/) [root/composer-test]: ew/composer-test
Description []: Just a test app
Author []: Eduardo Weiland <my@ema.il>
Minimum Stability []: stable
License []: none

Define your dependencies.

Would you like to define your dependencies (require) interactively [yes]? no
Would you like to define your dev dependencies (require-dev) interactively [yes]? no

IMPORTANTE: quando o Composer perguntar se você quer definir as dependências interativamente, digite no, pois o CakePHP precisa de algumas configurações adicionais para funcionar. No final do assistente, confirme a geração do código do composer.json e em seguida abra o arquivo para edição (qualquer editor de texto simples serve, mas eu recomendo o vim 😉 ).

O arquivo, por enquanto, deve parecer com o seguinte:

{
    "name": "ew/composer-test",
    "description": "Just a test app",
    "license": "none",
    "authors": [
        {
            "name": "Eduardo Weiland",
            "email": "my@ema.il"
        }
    ],
    "minimum-stability": "stable",
    "require": {

    }
}

Bastante incompleto, não é? Então vamos melhorá-lo um pouco. Comece adicionando a configuração do repositório do CakePHP, conforme as instruções na página oficial. Até a versão atual (2.4.5), para isso era necessário apenas acrescentar as seguintes linhas no arquivo:

"repositories": [
    {
        "type": "pear",
        "url": "http://pear.cakephp.org"
    }
]

Feito isso, basta adicionar a dependência do CakePHP dentro do objeto “require”, como é feito a seguir:

"require": {
    "pear-cakephp/cakephp": ">=2.4.0"
}

Outra coisa a ser feita, que não é essencial mas mantém o padrão utilizado pelo CakePHP, é definir o nome do diretório de instalação dos pacotes pelo Composer. E para isso, é só adicionar mais algumas linhas no arquivo:

"config": {
    "vendor-dir": "Vendor"
}

No final, o arquivo deve estar semelhante ao seguinte:

{
    "name": "ew/composer-test",
    "description": "Just a test app",
    "license": "none",
    "authors": [
        {
            "name": "Eduardo Weiland",
            "email": "my@ema.il"
        }
    ],
    "minimum-stability": "stable",
    "require": {
        "pear-cakephp/cakephp": ">=2.4.0"
    },
    "repositories": [
        {
            "type": "pear",
            "url": "http://pear.cakephp.org"
        }
    ],
    "config": {
        "vendor-dir": "Vendor"
    }

composer install

Tento o arquivo composer.json completo, basta agora deixar o composer fazer a mágica dele:

Terminal

$ composer install

Esse comando irá baixar e “instalar” o CakePHP para a pasta “Vendor” configurada. Um novo arquivo, composer.lock será gerado informando quais versões dos pacotes foram instaladas. Quando outros desenvolvedores rodarem o comando composer install, serão instaladas as mesmas versões (até que seja executa um composer update). Por isso os arquivos composer.json e composer.lock devem ser adicionados ao controle de versão utilizado (e o conteúdo do diretório Vendor – ou o próprio diretório – deve ser ignorado, pois o conteúdo pode ser facilmente replicado.)

Criando o projeto

Bom, agora que temos o framework do CakePHP instalado, falta o esqueleto que foi visto no último post. Agora quem vai ajudar nessa tarefa é o próprio CakePHP, com o famoso cake bake. Para criar a estrutura inicial do projeto, execute:

Terminal

$ Vendor/bin/cake bake project

Welcome to CakePHP v2.4.5 Console
—————————————————————
App : composer-test
Path: /home/eduardo/composer-test/
—————————————————————
What is the path to the project you want to bake?
[/home/eduardo/composer-test/myapp] > /home/eduardo/composer-test
Skel Directory: /home/eduardo/composer-test/Vendor/pear-pear.cakephp.org/CakePHP/Cake/Console/Templates/skel
Will be copied to: /home/eduardo/composer-test
—————————————————————
Look okay? (y/n/q)
[y] > y

Por algum motivo que eu não sei exatamente qual, todos os arquivos gerados pelo CakePHP possuem permissão de execução (!!!!!). Para resolver isso, use o comando
$ find . -path ./Vendor -prune -o ! -type d -executable -execdir chmod -x {} +
Esse comando irá encontrar (find) a partir do diretório atual (.), ignorando (-prune) a pasta (-path) ./Vendor, todos os arquivos que não sejam diretórios (! -type d) e que sejam executáveis (-executable) e para cada um deles irá executar (-execdir) o comando “chmod -x <arquivo>”.

Configurações

Antes de poder utilizar o CakePHP como foi instalado, precisamos fazer ainda umas pequenas configurações.

Primeiramente, precisamos definir qual é o diretório onde o CakePHP está instalado. Isso é feito editando os arquivos webroot/index.php e webroot/test.php. Nesses dois arquivos, encontre a linha em que o valor da constante CAKE_CORE_INCLUDE_PATH é definida e altere para

define('CAKE_CORE_INCLUDE_PATH',  ROOT . DS . APP_DIR . DS . 'Vendor' . DS . 'pear-pear.cakephp.org' . DS . 'CakePHP');

A última alteração necessária é no arquivo Config/bootstrap.php. Nesse arquivo, é necessário configurar o autoload do Composer para funcionar com o CakePHP, assim você poderá instalar qualquer outra biblioteca com o Composer que ela estará disponível para uso. Para isso só é preciso adicionar as seguintes linhas de código no final do arquivo:

// Carrega o loader co Composer
require APP . '/Vendor/autoload.php';

// Essas linhas removem o autoloader do CakePHP e o adicionam de
// volta como o primeiro autoloader a ser utilizado. Isso evita
// conflitos entre as classes definidas na sua aplicação e
// definidas em outras bibliotecas.
spl_autoload_unregister(array('App', 'load'));
spl_autoload_register(array('App', 'load'), true, true);

Console Cake

Para utilizar o console do CakePHP com a instalação pelo Composer, basta utilizar o comando do console da própria aplicação (ele vai ler as configurações e saber onde encontrar o console do Cake). Para executá-lo, o comando é Console/cake. Mas se você acha que digitar esse comando é muito trabalhoso, existem algumas formas de melhorar isso:

Link simbólico

Crie um link na raiz do projeto para executar esse comando:

Terminal
$ ln -s Console/cake cake

Assim, o comando para executar será ./cake

Alias

Defina um alias (apelido) para o comando:

Terminal
$ alias cake=Console/cake

Função (minha preferida)

Crie uma função para verificar e executar o comando. A vantagem é que a função pode realizar uma análise maior e permitir inclusive executar o comando de qualquer diretório de dentro do aplicativo. A função que eu particularmente utilizo é a seguinte (você pode adicionar essa função no seu arquivo .bashrc):

function cake() {
    local PWD="$(pwd)"

    while test "$PWD" != "/"; do
        if [ -x "$PWD"/Console/cake ]; then
            "$PWD"/Console/cake -app "$PWD" $@
            return $?
        fi;
        PWD=$(dirname "$PWD")
    done;

    echo
    echo " == ERRO:  Projeto CakePHP não foi encontrado! =="
    echo
    echo " Esse comando deve ser executado dentro da árvore "
    echo " de diretórios de um projeto do CakePHP."
    echo
    return 1
}
  • Garanta que o arquivo Console/cake seja executável! (chmod +x Console/cake)

Conclusão

Agora que você já tem o CakePHP instalado e funcionando com o Composer, você pode aproveitar para adicionar alguns plugins, como o DebugKit. Utilizando o Composer você consegue instalar muitas outras bibliotecas para usar no seu projeto, pois atualmente qualquer biblioteca em PHP decente deveria suportar o Composer.

Até a próxima!

One thought on “CakePHP com Composer”

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *