Instalando e configurando o Composer com a PSR-4

What-is-PHP-Composer-

Olá pessoal!

Este post vai para quem tem dificuldade (assim como eu) em instalar e configurar o Composer com a PSR-4.

fonte: https://mastigado.wordpress.com

Para quem não sabe as “PSRs” do PHP são a grosso modo um conjunto de boas práticas para padronizar frameworks e acredito que também sirva para nossos próprios apps. Esse conjunto de PSRs foi criado por uma organização chamada PHP-FIG (http://www.php-fig.org/) e existem até hoje cerca de 18 delas.

Neste post trato especificamente de como configurar o Composer e a inserção da PSR-4 que é responsável pelo autoload dos arquivos do PHP. Este “autoload” é útil para que carreguemos nossos arquivos sem ter de ficar utilizando o método require_once ou require do PHP. E por que utilizar a PSR-4? Bem, a PSR-4 substituiu a PSR-0 que também é responsável pelo autoload dos arquivos, mas que entrou em estado deprecated.

Pois bem e o Composer? Bem, o Composer é um gerenciador de dependências do PHP que funciona como um gerenciador de pacotes, assim como o nuget do C#, o Apt do Debian, o Yum do Fedora/Cent-OS e por aí vai.

Download do Composer

Para baixarmos o Composer podemos seguir as orientações de seu próprio site no endereço https://getcomposer.org/download/ e seguir as instruções (caso as que eu coloquei abaixo estejam desatualizadas), porém antes execute as seguintes que estão enumeradas abaixo.

  1. Se estiver no Linux abra o terminal, entre na raiz de seu projeto (se for no Windows, tente usando o prompt);
  2. Crie um diretório com o nome public;
  3. Coloque seu arquivo index.php dentro deste diretório public;
  4. Ainda na raiz do projeto crie dois diretórios, um chamado de vendor e outro de app;
  5. Dentro do diretório vendor crie de preferência um diretório com o nome de sua instituição, pode ser minhaempresa (ou pense em outro nome que caracterize essa idéia);
  6. E dentro do diretório app crie uma classe chamada de Init.php com o conteúdo abaixo.

Init.php

<?php

namespace app;
class Init {

    public function __construct() {
       echo "Ok. It works!";
    }
}

E agora, dentro da pasta raiz de seu projeto, execute as linhas abaixo no terminal (uma de cada vez). Lembrando que o comando php no início de cada linha está pressupondo que você já tem o seu diretório mapeado no PATH de sua máquina (se você não sabe o que é PATH, recomendo ler este post que fiz sobre isso e outro post que fiz sobre como configurá-lo), caso contrário escreva o caminho completo antes de executar o comando (no Linux pode ser algo assim: /opt/php7/bin/php e no Windows algo como isto: C:XamppPHP7binphp.exe).

   php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
   php composer-setup.php
   php -r "unlink('composer-setup.php');"

Arquivo composer.json

Vou deixar algumas observações sobre o conteúdo deste arquivo que servirá de base para a configuração do Composer.

Basicamente esta área abaixo está reservada para que você defina a partir de qual versão do PHP será instalada em sua máquina, quais serão os pacotes que são requeridos na instalação e o mínimo de tipo de versão aceitável do aplicativo.

    "name": "meuapp/developer",
    "require": {
       "php": ">=7.3.5"
    },
    "require-dev": {
       "phpunit/phpunit": "8.2.5@stable",
       "squizlabs/php_codesniffer": "dev-master"
    },
    "minimum-stability": "alpha",

Já a área onde tratamos da PSR-4, responsável pelo carregamento da estrutura de arquivos de nossa aplicação terá este raciocínio:

A raiz do meu projeto PHP é composta por um diretório que se chama meuapp e lá dentro tenho as pastas app, public e vendor, sendo que  dentro de vendor tenho um diretório chamado de minhaempresa. Portanto quando defino o mapeamento das minhas classes na definição da PSR-4 sempre tenho que me referir ao que está dentro da raiz de meu projeto (no caso a pasta meuapp).  Na primeira linha de mapeamento (do script abaixo) deixei o código assim: “minhaempresa\” : “vendor/minhaempresa” porque estou dizendo que quero mapear a pasta minhaempresa que está no caminho vendor -> minhaempresa e que por consequência está dentro de meuapp, contudo para ser mais específico, o mapeamento omite a pasta meuapp na nomenclatura, mas na prática ele quer dizer isso: meuapp/vendor/minhaempresa. O mesmo raciocínio se aplica para a linha de mapeamento do diretório app que em outras palavras que dizer meuapp/app. Tenham bastante atenção nisso, pois é algo simples que me fez perder um tempo considerável para entender (2 dias refletindo sob o calor da rua e do altamente gelado ar condicionado do meu serviço) , então se alguém tiver dúvida poste aqui.


      "autoload": {
         "psr-4": {
            "minhaempresa\\" : "vendor/minhaempresa",
            "app\\" : "app"
         }
      },

Agora, o próximo passo é criar na raiz de sua aplicação um arquivo chamado composer.json e coloque dentro dele o conteúdo abaixo.

{
      "name": "meuapp/developer",
      "require": {
         "php": ">=7.3.5"
      },
      "require-dev": {
         "phpunit/phpunit": "8.2.5@stable",
         "squizlabs/php_codesniffer": "dev-master"
      },
      "minimum-stability": "alpha",
      "authors": [{
         "name": "Minha Empresa",
         "email": "developer@minhaempresa.com.br"
      }],
      "autoload": {
         "psr-4": {
            "minhaempresa\\" : "vendor/minhaempresa",
            "app\\" : "app"
         }
      },
      "config": {
         "bin-dir": "bin"
      }
}

Sobre Deprecation em package name

Recentemente tentei instalar o composer como informado mais abaixo, porém sua versão 2.0 diz que é preciso alterar a nomenclatura do package name. Isso já foi neste post no valor “minhaempresa/developer”, tive de inserir um caractere / aí no meio para não dar problema, portanto fiquem tranquilos.

Deprecation warning: Your package name minharempresa is invalid, it should have a vendor name, a forward slash, and a package name. The vendor and package name can be words separated by -, . or _. The complete name should match “[a-z0-9]([_.-]?[a-z0-9]+)*/[a-z0-9]([_.-]?[a-z0-9]+)*”. Make sure you fix this as Composer 2.0 will error.

Sobre o arquivo composer.phar

Após baixado o Composer, um arquivo de nome composer.phar é criado e é ele que iremos executar para a configuração do composer

   php composer.phar install

Os comandos abaixo são opcionais, portanto não precisam ser executados

   php composer.phar install --no-plugins --no-scripts ...
   php composer.phar update --no-plugins --no-scripts ...

Conteúdo do arquivo index.php

Dentro do arquivo index.php você deverá colocar o conteúdo abaixo:

<?php
   require_once '../vendor/autoload.php';
   use app\Init;
   $init = new Init;

A partir de uma única chamada para o arquivo autoload.php feita no index.php não precisaremos mais utilizar o comando require_once em nenhum lugar de nosso app quando precisarmos instanciar alguma classe ou outro contido na definição da PSR-4 no arquivo composer.json.

E para finalizar, execute o servidor PHP embutido (dentro do diretório onde está o seu arquivo index.php) que você já tem na sua instalação do PHP.

Se estiver rodando na máquina local use este comando:

    php -S 127.0.0.1:8080

Senão, coloque o ip dela, execute e acesse de outra máquina.

   php -S 192.168.92.128:8080

O resultado tem que ser a impressão na tela da mensagem contida no construtor da classe Init.

Pronto! Tá aí mastigado.

fonte: https://mastigado.wordpress.com

fonte: https://getcomposer.org/doc/04-schema.md

fonte: http://pt.stackoverflow.com/questions/19200/composer-autoload-e-psr-0-vs-psr-4

fonte: http://www.douglaspasqua.com/2015/01/26/php-autoload-psr-4psr-0-com-composer/

fonte: https://getcomposer.org/doc/01-basic-usage.md

fonte: https://seld.be/notes/psr-4-autoloading-support-in-composer

fonte: https://github.com/pavlakis/psr4-with-composer

fonte: http://www.php-fig.org/psr/psr-4/meta/

fonte: https://seld.be/notes/psr-4-autoloading-support-in-composer

fonte: https://getcomposer.org/doc/faqs/how-to-install-untrusted-packages-safely.md

//PSR-4 com Testes

fonte: http://culttt.com/2014/05/07/create-psr-4-php-package/