PHP
Gerenciador de dependências Composer
Olá! Eu aparecendo aqui novamente, é raro, mas vamos que vamos, felizmente não sobrando tempo, quer dizer que trampos estão aparecendo, não é mesmo.
Você já ouviu falar de Gerenciamento de Dependências? Composer? Se já ouviu isso é bom, significa que você está por dentro dos melhores métodos de desenvolvimento, se não ouviu, não se assuste, pois vou explicar neste artigo o que são “gerenciadores de dependências”.
Você que desenvolve há algum tempo em PHP, já deve ter reparado como é difícil manter uma estrutura de projeto por meio de orientação a objeto. Geralmente quando começamos a desenvolver sob este paradigma, fica difícil controlar toda a estrutura de classes tanto de terceiros, quanto as próprias.
Vou dar um exemplo:
Suponhamos que seu projeto tenha uma classe Cliente e esta se utiliza de uma composição da classe Documentos, pois bem, no arquivo da classe Cliente precisamos também conter a classe Documento, muitas vezes no passado e bem no passado, para solucionar a dependência da classe Cliente, faríamos um “require” do arquivo da classe Documento, ou “require” do arquivo de uma função de mágica autoload, que por sua vez, teria alguma lógica pra achar a classe na sua arvore de pastas do seu projeto, ou pior do que, já projetos que classes eram elaboradas em um mesmo arquivo. (icon surpreso)
Bem e o que tem de errado nisso, a dependência era resolvida assim, não era?
Eu vejo alguns problemas nisso
- Primeiro, temos que ficar em toda classe incluído os arquivos de outras classes.
- Segundo, e se tiver várias dependências, eu tenho que incluir uma por uma.
- Terceiro, eu que tenho que fazer isso manualmente.
Você deve estar se perguntando, mas se eu tiver uma função autoload isso tudo não acontece, porque ela irá carregar tudo assim eu só vou requirir um arquivo???
A princípio, isso parece resolver mesmo, mas pense bem a função autoload, resolve a maneira como você carrega suas classes porque ela foi elaborada por você e pra suas necessidades e estrutura de projeto.
A pergunta é, e se você for usar uma classe de terceiro, será que a lógica do seu autoload se aplica a da dele?
Outra pergunta, e se esta classe do terceiro depender de diversas outras de outros terceiros?
Veja que as coisas começam a ficar complexa e pra gerenciar toda essa dependência na mão, fica muito difícil, quando não impossível. =)
Ai pra solucionar isso foram desenvolvidos ferramentas de gerenciamento de dependências, npm, bower , composer e acredito que deva existir outras.
Cada ferramenta tem sua especificidade, por exemplo, o npm é para trabalhos com node.
Aqui eu irei mostrar o uso do Composer pra desenvolvimento em PHP.
O primeiro passo é baixar o Composer e instalá-lo, entre no site e siga as recomendações de acordo com sua plataforma. Observação, se estiver utilizando Linux, primeiro tenho orgulho de você (icon_sorridente), segundo você pode baixar o arquivo composer.phar e deixar na pasta do seu projeto para execução local ou também torná-lo global, assim você irá baixá-lo apenas uma vez e irá executar em qualquer projeto, as instruções estão no site do https://getcomposer.org/
Agora se for windows e só executar o instalador.
Instalação local Linux / Unix / OSX
Executar os comandos no shell
Usando curl:
curl -sS https://getcomposer.org/installer | php
Usando php caso não tenha curl
php -r "readfile('https://getcomposer.org/installer');" | php
Instalação global Linux / Unix / OSX
Usando curl:
curl -sS https://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/composer
Usando php caso não tenha curl:
curl -sS https://getcomposer.org/installer | sudo php -- --install-dir=/usr/local/bin –filename=composer
Para WINDOWS é só baixar o instalador https://getcomposer.org/Composer-Setup.exe.
Bem agora que esta instalado vamos utilizá-lo, no shell ou prompt excute:
composer init
Se estiver no windows:
php composer init
A partir de agora ele começa a requirir informações para criar o arquivo composer.json que conterá os parâmetros e require de nosso projeto necessita.
- Name: utilizamos normalmente o nome vendor/projeto ex.: Acme/Blog
- Description: opicional
- Author: Nome dos desenvolvedores
- Minimum Stability: dev, alpha, beta, RC ou stable (Essa opção influência a versão com estabilidade mínima exigida dos pacotes e dependências a se trabalhar)
- Package Type: é utilizada para pacotes específicos, que possuem uma lógica especial, tipo o symfony-bundle, no nosso caso, vamos deixar vazio.
- License: para projetos fechados use proprietary, você pode usar algumas das licenças já existentes, neste site você encontra elas https://spdx.org/licenses/, outra opção é deixar em branco.
Agora você começará a definir suas dependências de terceiros.
Neste exemplo vamos incluir apenas uma, neste caso vamos incluir os pacotes de doctrine. Em:
Search for a package: doctrine
Ele listará todos os pacotes doctrine, escolha algum pelo numero, no meu caso escolhi o 12 [doctrine/orm]
Agora ele pede a versão: coloque “*” sem as aspas, lembre-se se não colocar nada, ele requererá pelo minimum stability.
Vamos incluir somente este pacote neste exemplo, para isso digite enter sem escrever.
Agora ele pergunta se temos alguma dependência para nosso desenvolvimento, ou seja, pacotes que somente serão rodadas em ambiente de desenvolvimento, não, no de produção.
Digite enter para dizer que sim.
Na pesquisa digite: unit
Nas opções resultantes da pesquisa, digite o numero da opção phpunit/phpuni, aqui foi a 11.
Na versão coloque “*” sem aspas.
Agora já pode apertar enter, não vamos incluir outra dependência de desenvolvimento.
Será exibido o resultado do arquivo composer.json, agora é só confirmar.
Veja agora, já temos o arquivo composer.json na pasta do seu projeto, abra o arquivo e confira seus dados. Ele deverá se parecer assim:
{ "name": "Acme/Blog", "require": { "doctrine/orm": "*" }, "require-dev": { "phpunit/phpunit": "*" }, "authors": [ { "name": "Everton de Paula", "email": "e-mail@email.com" } ], "minimum-stability": "dev" }
Este método de geração não é obrigatório, eu utilizei ele neste exemplo para fins didáticos, com o tempo você irá perceber que a geração manual em um arquivo denominado composer.json será mais fácil e eficiente.
Veja se mandarmos o composer submeter este arquivo ele não irá gerar o autoload automático, pois eles ainda não contem esta opção, então vamos inclui-la.
"autoload" : { "psr-0" :{ "Namespace" : "src/", } },
Não se esqueça de colocar dentro das {} principais e de inserir uma, após o ultimo parâmetro neste caso "minimum-stability": "dev".
O que é importante perceber aqui, o padrão utilizado para o autoload é o psr-0. Se você nunca ouviu falar sobre esse padrão comente aqui, e eu farei um artigo explicando sobre ele, o outro é o “Namespace”, você deve substituir esse Namespace pelo o de sua aplicação.
Geralmente quando desenvolvo, crio os namespace baseados no meu vendor, por exemplo: minha empresa chama-se Acme, então colocaria Acme. O “src/” será a pasta que colocaremos a estrutura de nossas classes, ou seja, lá ficam todas as classes próprias da aplicação, as classes de terceiros ficaram em vendor.
No final o arquivo estará parecido com este:
{ "name": "Acme/Blog", "require": { "doctrine/orm": "*" }, "require-dev": { "phpunit/phpunit": "*" }, "authors": [ { "name": "Everton de Paula", "email": "email@email.com" } ], "minimum-stability": "dev", "autoload" : { "psr-0" :{ "Acme" : "src/" } } }
Com isso já podemos submeter o composer.json. No shell ou prompt efetue o comando, estando na pasta do projeto.
composer install
Se estiver no windows o comando será:
php composer install
Pronto, ele começara a baixar todas as dependências automaticamente. Fique olhando todas as ocorrências no shell ou prompt e repare a quantidade de arquivos que ele esta baixando pra somente duas require que fizemos o doctrine/orm e phpunit.
Após terminar entre na pasta do projeto e verique que foi criado um arquivo chamado composer.lock. Ele é o arquivo resultado de todas suas dependências, é através dele que o composer baixou todo o conteúdo.
Você também irá verificar que ele criou uma pasta vendor, nela contem todas as dependências de terceiros, também deve conter um arquivo chamado autoload.php, este arquivo você pode fazer um require_once no seu index.php e se sua aplicação tiver um roteamento de paginas, o que é comum hoje em dia em qualquer aplicação web, você só precisará deste require na aplicação toda.
E com isso, todas as classes em vendor ou na pasta src/ estrão disponíveis através de seus namespaces, inclusive se você estiver usando uma IDE, ela será capaz de fazer o autocomplete dos nomes das classes e seus namespaces.
Perceberam a vantagem, já imaginou você ter que caçar cada conteúdo que foi baixado em vendor, cada dependência, ficaríamos simplesmente malucos.
Se ficou duvidas sobre este artigo comentem, lembre-se, trabalhar com o composer é extremamente comum e necessário hoje em dia. =)
Gigasystems Login:
Informe seu e-mail abaixo para continuar!
XVeja Também:
Artigos Relacionados a categoria: PHP
Cotações para compra e venda de Moedas estrangeiras com PHP
27 July de 2016
Erro ao acessar um arquivo externo com o comando file_get_content
04 November de 2015
Baixando anexo do email no servidor com IMAP e PHP
27 August de 2015
Ler Email do servidor com IMAP e PHP
19 August de 2015
Olá, deixe seu comentário para Gerenciador de dependências Composer