Dentro do php existem diversas tecnologias que facilitam nossa vida, trazem mais agilidade e para nisso o composer foi criado, toda aplicação demanda recursos e funções para realizar determinadas tarefas, nem todas elas são criadas pelo próprio desenvolvedor e sim pela comunidade, podemos chamar isso de bibliotecas do projeto, recursos como o de enviar e-mail, de forma mais abstraída, como também criação de slug ou estrutura para conexão e manipulação de banco de dados.

Isso tudo traz a facilidade, imagine criamos tudo isso todas as vezes que criamos um projeto, o composer veio com a intenção de unir vários repositórios de vários desenvolvedores a uma aplicação, tornando o desenvolvimento mais rápido, fazendo autoload das classes e disponibilizando em todo o projeto.

Nesse post vamos criar uma aplicação usando composer, e alguns repositórios e algumas estruturas que criei. Comando apresentado será mostrado no linux.

1- Primeiro passo é instalar o composer na sua máquina, nesse projeto vamos trabalha no linux, por isso os comandos mostrados vão ser exclusivos do linux no seu terminal.

https://getcomposer.org/doc/00-intro.md#installation-linux-unix-macos

2- Crie uma pasta na sua máquina, abaixo mostro uma boa forma de fazer isso, para ficar um pouco mais organizado, logo depois de criar a pasta vamos digitar o comando do composer para podermos iniciar nosso app:

cd /home/$USER

mkdir projects

mkdir projects/my-app

cd projects/my-app

composer init

Resultado:

Welcome to the Composer config generator

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

Package name (<vendor>/<name>) [abelaguiar/app]:

Description []:

Author [Abel Aguiar <abel.prog@gmail.com>, n to skip]:

Minimum Stability []:

Package Type (e.g. library, project, metapackage, composer-plugin) []:

License []: MIT

Ao executar composer init, ele vai criar um arquivo dentro do seu diretório do projeto chamado composer.json, nele vai ter algumas informações relacionadas ao projeto, e a primeira informação que ele pede é o namespace, ele sugere um para você, no meu caso seria meu [GITHUB] / [NOME DA PASTA] que é o que vamos usar aqui.

Logo após vai pedir uma descrição, o que é opcional, aí vem autor, podendo colocar qualquer nome, por padrão ele pega o github. 

Na sequência vem a versão estável do projeto, isso vai servir quando temos algumas versões e uma em específico está no ponto das pessoas usarem, seria a versão de produção, podendo ter versões mais avançadas para serem testadas ainda.

Pergunta o tipo de projeto, basta digitar umas das opções colocadas, mas é opcional, logo após vem a licença, que podemos colocar livre como a MIT ou restringindo o uso, isso serve mais para outros desenvolvedores saberem o que podem ou não ser feito com o código.

Por último vem a pergunta de quais dependências vai precisar para sua aplicação, abaixo vão está as que vão ser usadas no projeto:

Define your dependencies.

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

Search for a package: php
Enter the version constraint to require (or leave blank to use the latest version): ^7.2

Search for a package: vlucas/phpdotenv
Enter the version constraint to require (or leave blank to use the latest version):

  Using version ^5.2 for vlucas/phpdotenv

Search for a package: doctrine/orm
Enter the version constraint to require (or leave blank to use the latest version):

  Using version ^2.7 for doctrine/orm

Search for a package: doctrine/dbal
Enter the version constraint to require (or leave blank to use the latest version):

  Using version ^2.10 for doctrine/dbal

Search for a package: erandir/plug-route
Enter the version constraint to require (or leave blank to use the latest version):

  Using version ^3.9 for erandir/plug-route

No final da configuração é exibido como vai ficar o conteúdo, mais duas perguntas, para confirmar a geração do arquivo e depois se pode instalar as dependências escolhidas anteriormente:

{
    "name": "abelaguiar/app",
    "type": "project",
    "require": {
        "php": "^7.2",
        "vlucas/phpdotenv": "^5.2",
        "doctrine/orm": "^2.7",
        "doctrine/dbal": "^2.10",
        "erandir/plug-route": "^3.9"
    },
    "authors": [{
        "name": "Abel Aguiar",
        "email": "abel.prog@gmail.com"
    }]
}

Do you confirm generation [yes]? yes
Would you like to install dependencies now [yes]? yes

Concluirmos o processo de fazer a instalação de tudo exibindo o resumo abaixo:

Loading composer repositories with package information

Updating dependencies (including require-dev)

Package operations: 28 installs, 0 updates, 0 removals

- Installing ocramius/package-versions (1.5.1): Downloading (100%)
- Installing symfony/polyfill-php80 (v1.18.1): Loading from cache
- Installing symfony/polyfill-mbstring (v1.18.1): Loading from cache
- Installing symfony/polyfill-ctype (v1.18.1): Loading from cache
- Installing phpoption/phpoption (1.7.5): Loading from cache
- Installing graham-campbell/result-type (v1.0.1): Downloading (100%)
- Installing vlucas/phpdotenv (v5.2.0): Downloading (100%)
- Installing erandir/plug-http (v1.8): Downloading (100%)
- Installing erandir/plug-route (v3.9): Downloading (100%)
- Installing symfony/polyfill-intl-normalizer (v1.18.1): Loading from cache
- Installing symfony/polyfill-intl-grapheme (v1.18.1): Loading from cache
- Installing symfony/string (v5.1.5): Downloading (100%)
- Installing psr/container (1.0.0): Loading from cache
- Installing symfony/service-contracts (v2.2.0): Downloading (100%)
- Installing symfony/polyfill-php73 (v1.18.1): Loading from cache
- Installing symfony/console (v5.1.5): Downloading (100%)
- Installing doctrine/lexer (1.2.1): Loading from cache
- Installing doctrine/annotations (1.10.4): Downloading (100%)
- Installing doctrine/reflection (1.2.1): Downloading (100%)
- Installing doctrine/event-manager (1.1.1): Downloading (100%)
- Installing doctrine/collections (1.6.7): Downloading (100%)
- Installing doctrine/cache (1.10.2): Loading from cache
- Installing doctrine/persistence (2.0.0): Downloading (100%)
- Installing doctrine/instantiator (1.3.1): Loading from cache
- Installing doctrine/inflector (1.4.3): Downloading (100%)
- Installing doctrine/dbal (2.10.4): Downloading (100%)
- Installing doctrine/common (3.0.2): Downloading (100%)
- Installing doctrine/orm (v2.7.3): Downloading (100%)

symfony/service-contracts suggests installing symfony/service-implementation
symfony/console suggests installing symfony/event-dispatcher
symfony/console suggests installing symfony/lock
symfony/console suggests installing symfony/process
symfony/console suggests installing psr/log (For using the console logger)
doctrine/cache suggests installing alcaeus/mongo-php-adapter (Required to use legacy MongoDB driver)
doctrine/orm suggests installing symfony/yaml (If you want to use YAML Metadata Mapping Driver)

Writing lock file

Generating autoload files

ocramius/package-versions: Generating version class...
ocramius/package-versions: ...done generating version class

21 packages you are using are looking for funding.

É mostrado mais pacotes do que pedimos porque os pacotes que selecionamos têm suas dependências e por aí vai, tudo é instalado e referenciado no autoload, que é a mágica do composer.

Se olharmos dentro do projeto agora vamos ter essa estrutura:

  • composer.json  / Arquivo
  • composer.lock  / Arquivo
  • vendor / Pasta

O arquivo composer.json com o resumo das dependências e requerimentos do projeto, composer.lock fazendo todo o autoload, referenciando as classes dentro do projeto e por último a pasta vendor com tudo o que foi baixado.

Para melhor organização vamos adicionar no composer.json as informações abaixo, assim poderemos criar uma pasta chamada src referenciando ela como App no namespace, dentro dela vamos colocar nossas classes, views e lógica.

"autoload": {
    "psr-4": {
        "App\\": "src"
    },
    "files": [
        "src/Support/helpers.php"
    ]
}

Também vamos criar um arquivo chamado helpers.php, nele vamos criar funções de uso geral e que ficaram disponíveis em qualquer lugar, isso facilita, pois nem sempre precisamos instanciar algo para chamar funções simples, ou queremos deixar uma função nativa do php mais fácil de entender, como as relacionadas a formatação de textos.

Estrutura de pastas:

> src
    > Support
        - helpers.php
- vendor
- composer.json
- composer.lock

Agora vamos colocar uma estrutura dentro de src chamada MVC (Models, Views e Controllers), fazendo dessa separaremos todas as responsabilidades, facilitando a manutenção e adição de novos desenvolvedores para o projeto.

> src
    > Controllers
    > Models
    > Support
        - helpers.php
    > Views
> vendor
- composer.json
- composer.lock

Vamos adicionar uma pasta chamada config que vai ter a conexão com o banco e as rotas para as classes, outra pasta que vamos precisar é a public, onde o servidor vai apontar para obter as requisições do app, dentro dessa pasta vai ter um arquivo chamado index.php.

> config
> public
    - index.php
> src
    > Controllers
    > Models
    > Support
        - helpers.php
    > Views
> vendor
- composer.json
- composer.lock

Dentro do arquivo index.php vai:

<?php

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);

error_reporting(E_ALL);

require_once dirname(__DIR__)."/vendor/autoload.php";

use \PlugRoute\PlugRoute;

/**** CORS ****/

header('Access-Control-Allow-Origin: *');
header("Access-Control-Allow-Methods: GET, POST, PUT, DELETE, PATCH");
header("Access-Control-Allow-Headers: Content-Type");

/**** CORS ****/

$route = new PlugRoute();
require_once dirname(__DIR__)."/config/routes.php";
$route->on();

Colocando a esses dados no arquivo index.php vamos ter a configurações de rotas fornecidas pelo pacote erandir/plug-route, como também o autoload referenciando tudo do projeto.

Fazendo tudo isso o projeto está pronto para começar, tendo o modelo MVC como base e o composer fazendo autoload dos pacotes selecionados, espero que esse post tenha ajudado.

Bibliografia

https://github.com/abelaguiar/estrutura-projeto-simple

https://getcomposer.org

Translate »