CodeIgniter e Composer: como integrar e usar

27 de dezembro de 2012, em Integração, Tutoriais, por

Algo novo está surgindo no PHP. Algo que mudará, para melhor, a maneira como organizamos e gerenciamos nossos projetos: Composer.

Em poucas palavras, Composer é um gerenciador de pacotes/dependências para PHP. Isso quer dizer que, usando Composer, é possível, de maneira simples, rápida e muito, muito fácil, instalar, atualizar e remover “pacotes” (bibliotecas e, até, projetos inteiros) de nossas aplicações web. Para mais informações, leia o artigo Composer: a evolução PHP – de fato, você precisa saber o que é e, pelo menos, o básico, sobre como trabalhar com o Composer para entender este tutorial.

Então, supondo que você já sabe como usar o Composer e já o tem corretamente instalado em sua máquina, é o momento de aprender como integrá-lo com nosso querido CodeIgniter e elevar seus projetos em CI para o próximo nível.

composer.json

Como você já deve saber a essa altura, é preciso um arquivo composer.json na raiz do projeto para que o Composer consiga gerenciar os pacotes corretamente. No caso da dobradinha CodeIgniter + Composer, não há alteração alguma quanto a isso, e o arquivo composer.json continua na raiz do projeto, ao lado dos diretórios system e application e do arquivo index.php.

Servindo de cobaia teste para o tutorial, vamos usar a GravatarLib, que, como você deve ter imaginado, é uma pequena biblioteca destinada à fácil integração com o serviço Gravatar. Seguindo o indicado nas especificações da GravatarLib no Packagist, o require no composer.json deverá seguir:

?View Code JAVASCRIPT
{
    "require":
    {
        "emberlabs/gravatarlib": "dev-master"
    }
}

Seguindo com o workflow padrão do Composer, tudo daria certo, mas, como querendo integrar o Composer com CodeIgniter, seria interessante preservarmos a estrutura do CI para se ter um código bem organizado. Para tanto, é preciso alterar o diretório padrão em que o Composer gere as dependências. No caso do CodeIgniter, um bom local seria application/libraries, concorda? Então, o arquivo composer.json deve se parecer com o seguinte:

{
    "config":
    {
        "vendor-dir": "application/libraries"
    }
 
    ,"require":
    {
        "emberlabs/gravatarlib": "dev-master"
    }
}

autoload.php

Também é preciso, como você viu no artigo sobre o Composer, incluir o autoload.php. Pensando, novamente, na integração CodeIgniter/Composer, isso será feito no arquivo index.php do CodeIgniter – aquele, mesmo, na raiz do projeto. Atenção, pois a inserção do código a seguir deve ser feita antes da chamada ao bootstrap do CodeIgniter:

require_once $application_folder . '/libraries/autoload.php';

É muito importante que isso seja feito antes da inclusão do CodeIgniter.php, caso contrário, não funcionará. Para ter uma visão melhor, veja como deve ficar o finalzinho do arquivo index.php:

194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
/*
 * --------------------------------------------------------------------
 * COMPOSER AUTOLOAD
 * --------------------------------------------------------------------
 */
require_once $application_folder . '/libraries/autoload.php';
 
/*
 * --------------------------------------------------------------------
 * LOAD THE BOOTSTRAP FILE
 * --------------------------------------------------------------------
 *
 * And away we go...
 *
 */
require_once BASEPATH.'core/CodeIgniter.php';
 
/* End of file index.php */
/* Location: ./index.php */

Instalação e testes

Agora, já é possível executar a instalação com composer install no Terminal (ou seja lá o que você esteja usando para comandos).

Depois da instalação inicial, os arquivos composer.json e composer.lock estarão, normalmente, na raiz do projeto; entretanto, como especificado, a instalação dos pacotes, a partir de agora, se dará em application/libraries.

Estrutura de diretórios depois de instalar pacotes Composer no CodeIgniter

Clique para ampliar e ver a estrutura de diretórios do CodeIgniter depois de instalar pacotes pelo Composer

Agora chegou a parte divertida: usar os recursos instalados pelo Composer!

Você pode criar um controller para testes, só para ver como é o funcionamento. Aqui, também tem uma dica especial para usar os pacotes do Composer no CodeIgniter mantendo a compatibilidade da sintaxe, também: ao instanciar as classes, você pode atribuir a atributos de $this (nomeados como você achar melhor). Só tenha o cuidado de não atribuir algum nome de variável já pertencente a outro recurso sendo usado no momento da execução do código, senão haverá conflitos!

No exemplo proposto no artigo, seria possível atribuir o seguinte para instanciar o objeto da GravatarLib:

$this->gravatar = new \emberlabs\gravatarlib\Gravatar();

Dessa forma, é possível continuar usando a sintaxe habitual do CodeIgniter para interagir com bibliotecas instaladas pelo Composer. Somente para ilustrar, vamos exibir diretamente do controller de testes a imagem do seu avatar, mas, em projetos “de verdade”, você deve enviar como uma variável para ser mostrada numa view, assim como já explicado no artigo “Models, Views e Controllers trabalhando juntos no CodeIgniter“.

O código-exemplo:

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
 
class Teste extends CI_Controller
{
    public function index()
    {
        $this->gravatar = new \emberlabs\gravatarlib\Gravatar();
        $this->gravatar->setAvatarSize(150);
        echo '<img src="' . $this->gravatar->buildGravatarURL('seu@email.com') . '" width="150" height="150">';
    }
}

Usando meu e-mail no lugar de “seu@email.com”, a exibição não poderia ser diferente de:

Conclusão

A conclusão não poderia ser diferente da de mostrar o entusiasmo com a nova, emocionante e eficiente maneira de lidar com dependências em projetos PHP/CodeIgniter usando Composer. O PHP precisava desse tipo de ferramenta; ou melhor, os programadores PHP precisávamos! Para maiores informações sobre o Composer, releia o artigo Composer: a evolução PHP.

Colabore você, também, e ajude tudo a ficar ainda melhor. Estude a documentação do Composer e envie pacotes para o Packagist (principalmente pacotes CodeIgniter!). Fazendo isso, todos temos a ganhar e web, certamente, a evoluir!

16 comentários em "CodeIgniter e Composer: como integrar e usar"

gravatar

Jônatan Fróes  em 27 de dezembro de 2012

Fechou o ano com chave de ouro!

Parabéns e que venha 2013!

gravatar

Fernando  em 10 de janeiro de 2013

Obrigado, e parabens por compartilhar seu conhecimento, vc parece ser o único q conhece o composer, por que ninguém fala sobre ele ou da exemplos de sua utilização.

gravatar

Tárcio Zemel  em 11 de janeiro de 2013

Mais gente conhece, Fernando, mas, curiosamente, pouco está sendo falado nos blogs nacionais…

gravatar

Rafael Paulino  em 26 de janeiro de 2013

Acabei de fazer o curso da Treinaweb e agora fiz o seu tutorial!
Muito obrigado por compartilhar o seu conhecimento!

gravatar

Tárcio Zemel  em 30 de janeiro de 2013

Então você já conhece o CodeIgniter! A partir de agora, é reforçar os estudos e aprender coisas novas!

gravatar

Andreus Timmm  em 14 de março de 2013

E a pergunta que não quer calar, COMPOSER OU SPARK? Qual sua opinião?

gravatar

Tárcio Zemel  em 14 de março de 2013

Cara, getsparks.org vai se tornar um repositório do Composer (assim como o Packagist).

Acho que isso responde… =P

gravatar

Erich Casagrande  em 22 de maio de 2013

CI 3.0 com composer eba ! :)

gravatar

Daniel Neto  em 13 de julho de 2013

Novos projetos já são totalmente disponibilizados em composer, e realmente pouco se fala dele por aqui, apesar da grande inovação que ele trás.
Eu mesmo estou integrando o CI com Propel, usando o composer. Bem melhor, mais rápido e prático do que o antigo método de baixar, desempacotar, etc e tal.
Vlw pelo post

gravatar

Marcelo Diniz  em 3 de abril de 2014

Opa Tárcio, mesmo já tendo a um tempo esse seu artigo, só estou vendo agora, mas blz, muito bom. Agora tenho uma dúvida, nesse caso eu iria baixar todas dependencias para onde esta especificado aqui "vendor-dir": "application/libraries" correto. Tem como eu fazer com que as libraries vão para esse vendor-dir indicado e outros caso eu queira integrar outros projetos, bootstrap por exemplo, mandar para uma outra pasta especificada?

Valew

gravatar

Luã  em 14 de abril de 2014

Muito útil este artigo.
Obrigado por compartilhar a informação.

gravatar

Sadao  em 31 de maio de 2014

Olá!
Uma dúvida: preciso fazer alguma alteração no arquivo autoload do config? Tipo, carregar algum arquivo no $autoload['libraries'] e tal..

gravatar

Tárcio Zemel  em 10 de junho de 2014

De cabeça realmente não me lembro, mas chutaria que ele só suporta um "vendor" por vez. De qualquer maneira, o Composer é gerenciamento de pacotes de back-end, então não seria legal misturar…

Dê uma olhada no Bower, que é para front-end: http://desenvolvimentoparaweb.com/indicacoes/bowe

gravatar

Tárcio Zemel  em 10 de junho de 2014

Normalmente, não. Mas, se preciso for, na página de explicação do pacote vai avisar. :-)

gravatar

Cálcio  em 14 de maio de 2015

Hoje precisei utilizar o composer no CI e esse post ajudou muito. Como sempre o site sempre ajudando a galera.

Só um ponto. No caso do diretório, sugiro a third_party, pois ela é a mais indicada para libraries externas, o diretório library são para bibliotecas criadas para o próprio projeto.

gravatar

Fernando  em 10 de outubro de 2016

Olá bom dia pessoal, eu tenho uma necessidade aqui e não sei como seria para instalar o composer na minha estrutura. Eu tenho 2 maquinas windows sendo que uma tem o xampp instalado com todos os sites e sistemas dos clientes. Trabalhamos em 2 pessoas e essas 2 pessoas acessam essa maquina pela rede para alterar os arquivos dos sites… No caso eu teria que instalar o composer na pasta do projeto, mais esse projeto está na rede… como seria? já agradeço a ajuda!
Fernando

    Comente!