Carregamento automático do compositor PHP

Resumo : neste tutorial, você aprenderá como usar o Composer para carregar automaticamente classes PHP de arquivos usando o padrão PSR-4.

Carregando classes usando a construção require_once

Primeiro, crie a seguinte estrutura de diretórios com arquivos:

.
├── app
│   ├── bootstrap.php
│   └── models
│       └── User.php
└── index.phpLinguagem de código:  PHP  ( php )

O User.phparquivo na modelspasta contém a User classe :

<?php

class User
{
    private $username;

    private $password;

    public function __construct($username, $password)
    {
        $this->username = $username;
        $this->password = password_hash($password);
    }

    public function getUsername(): string
    {
        return $this->username;
    }
}Linguagem de código:  PHP  ( php )

A Useré uma aula simples. Tem duas propriedades $usernamee $password. O construtor inicializa as propriedades a partir de seus argumentos. Além disso, ele usa a password_hash()função para fazer hash do arquivo $password.

O bootstrap.phparquivo usa a require_onceconstrução para carregar a Userclasse do User.phparquivo na modelspasta:

<?php

require_once 'models/User.php';Linguagem de código:  PHP  ( php )

Quando você tiver mais classes na modelspasta, poderá adicionar mais require_onceinstruções ao bootstrap.phparquivo para carregar essas classes.

O index.phparquivo carrega o bootstrap.phparquivo e usa a Userclasse:

<?php

require './app/bootstrap.php';

$user = new User('admin', '$ecurePa$$w0rd1');Linguagem de código:  PHP  ( php )

Essa estrutura de aplicativo funciona bem se você tiver um pequeno número de classes. No entanto, quando o aplicativo tem um grande número de classes, ele require_oncenão é bem dimensionado. Neste caso, você pode usar a spl_autoload_register()função para carregar automaticamente as classes de seus arquivos .

O problema com a spl_autoload_register()função é que você mesmo precisa implementar as funções do autoloader. E seus autoloaders podem não gostar dos autoloaders desenvolvidos por outros desenvolvedores.

Portanto, ao trabalhar com uma base de código diferente, você precisa estudar os autoloaders nessa base de código específica para entender como eles funcionam.

É por isso que o Composer entra em cena.

Introdução ao Compositor

Composer é um gerenciador de dependências para PHP. O Composer permite que você gerencie dependências em seu projeto PHP. Neste tutorial, vamos nos concentrar em como usar o Composer para carregar automaticamente classes.

Antes de usar o Composer, você precisa baixá-lo e instalá-lo. A documentação oficial fornece etapas detalhadas de como baixar e instalar o Composer em seu computador .

Para verificar se o Composer foi instalado com sucesso, execute o seguinte comando no prompt de comando no Windows ou Terminal no macOS e Linux:

composer -vLinguagem de código:  PHP  ( php )

Ele retornará a versão atual e várias opções que você pode usar com o composercomando.

Carregamento automático de classes com o Composer

Voltando ao exemplo anterior, para usar o Composer, primeiro você cria um novo arquivo chamado composer.jsonna pasta raiz do projeto. O diretório do projeto ficará assim:

.
├── app
│   ├── bootstrap.php
│   └── models
│       └── User.php
├── composer.json
└── index.phpLinguagem de código:  PHP  ( php )

No composer.json, você adiciona o seguinte código:

{
    "autoload": {
        "classmap": ["app/models"]
    }
}Linguagem de código:  PHP  ( php )

Este código significa que o Composer carregará automaticamente todos os arquivos de classe definidos na app/modelspasta.

Se você tiver classes de outras pastas que deseja carregar, poderá especificá-las no classmaparray:

    {
        "autoload": {
            "classmap": ["app/models", "app/services"]
        }
    }Linguagem de código:  PHP  ( php )

Neste exemplo, o Composer carregará classes de ambos modelse servicespastas dentro da apppasta.

Em seguida, inicie o prompt de comando no Windows ou Terminal no macOS e Linux e navegue até o diretório do projeto.

Em seguida, digite o seguinte comando no diretório do projeto:

composer dump-autoloadLinguagem de código:  PHP  ( php )

O Composer irá gerar um diretório chamado vendorque contém vários arquivos como este:

.
├── app
│   ├── bootstrap.php
│   └── models
│       └── User.php
├── composer.json
├── index.php
└── vendor
    ├── autoload.php
    └── composer
        ├── autoload_classmap.php
        ├── autoload_namespaces.php
        ├── autoload_psr4.php
        ├── autoload_real.php
        ├── autoload_static.php
        ├── ClassLoader.php
        └── LICENSELinguagem de código:  PHP  ( php )

O arquivo mais importante para você por enquanto é autoload.phpfile.

Depois disso, carregue o autoload.phparquivo no bootstrap.phparquivo usando a require_onceconstrução:

<?php

require_once __DIR__ . '/../vendor/autoload.php';Linguagem de código:  PHP  ( php )

Finalmente, você pode usar a Userclasse no index.php:

<?php

require './app/bootstrap.php';

$user = new User('admin', '$ecurePa$$w0rd1');Linguagem de código:  PHP  ( php )

A partir de agora, sempre que você tiver uma nova classe no modelsdiretório, será necessário executar o comando composer dump-autoloadnovamente para gerar novamente o autoload.phparquivo.

Por exemplo, o seguinte define uma nova classe chamada Commentno Comment.phparquivo da modelspasta:

<?php

class Comment
{
    private $comment;

    public function __construct(string $comment)
    {
        $this->comment = $comment;
    }

    public function getComment(): string
    {
        return strip_tags($this->comment);
    }
}Linguagem de código:  PHP  ( php )

Se você não executar o composer dump-autoloadcomando e usar a Commentclasse no index.phparquivo, receberá um erro:

<?php

require './app/bootstrap.php';

$user = new User('admin', '$ecurePa$$w0rd1');

$comment = new Comment('<h1>Hello</h1>');
echo $comment->getComment();Linguagem de código:  PHP  ( php )

Erro:

Fatal error: Uncaught Error: Class 'Comment' not found in...Linguagem de código:  PHP  ( php )

No entanto, se você executar o composer dump-autoloadcomando novamente, o index.phparquivo funcionará corretamente.

Carregamento automático do compositor com PSR-4

PSR significa Recomendação Padrão PHP. PSR é uma especificação PHP publicada pelo PHP Framework Interop Group ou PHP-FIG.

Os objetivos do PSR são permitir a interoperabilidade dos componentes PHP e fornecer uma base técnica comum para a implementação das melhores práticas em programação PHP.

PHP-FIG publicou muitos PSR a partir do PSR-0. Para uma lista completa de PSR, confira a página PSR .

PSR-4 é um padrão de carregamento automático que descreve a especificação para carregamento automático de classes a partir de caminhos de arquivo. https://www.php-fig.org/psr/psr-4/

De acordo com o PSR-4, um nome de classe totalmente qualificado possui a seguinte estrutura:

 \<NamespaceName>(\<SubNamespaceNames>)*\<ClassName>Linguagem de código:  PHP  ( php )

A estrutura começa com um namespace, seguido por um ou mais subnamespaces e o nome da classe.

Para estar em conformidade com o PSR-4, é necessário estruturar a aplicação anterior assim:

.
├── app
│   ├── Acme
│   │   ├── Auth
│   │   │   └── User.php
│   │   └── Blog
│   │       └── Comment.php
│   └── bootstrap.php
├── composer.json
└── index.phpLinguagem de código:  PHP  ( php )

A nova estrutura possui as seguintes alterações:

Primeiro, o modelsdiretório é excluído.

Em segundo lugar, User.phpestá abaixo da Acme/Authpasta. E a Userclasse tem namespace com Acme/Auth. Observe como os namespaces são mapeados para a estrutura de diretórios. Isso também ajuda a encontrar um arquivo de classe mais rapidamente, observando seu namespace.

<?php

namespace Acme\Auth;

class User
{
    // implementation
    // ...
}Linguagem de código:  PHP  ( php )

Terceiro, Comment.phpestá abaixo da Acme/Blogpasta. A Commentclasse tem o namespace Acme\Blog:

<?php

namespace Acme\Blog;

class Comment
{
    // implementation
    // ...
}Linguagem de código:  PHP  ( php )

Quarto, o composer.jsonarquivo se parece com o seguinte:

{
    "autoload": {
        "psr-4": {
            "Acme\\":"app/Acme"
        }
    }
}Linguagem de código:  PHP  ( php )

Em vez de usar o classmap, o composer.jsonarquivo agora usa psr-4. O psr-4mapeia o namespace "Acme\\"para a "app/Acme"pasta.

Observe que a segunda barra invertida ( \) no Acme\namespace é usada para escapar da primeira barra invertida ( \).

Quinto, para usar as classes Usere Commentno index.phparquivo, você precisa executar o composer dump-autoloadcomando para gerar o arquivo autoload.php:

composer dump-autoloadLinguagem de código:  PHP  ( php )

Como as classes Usere Commentpossuem namespaces, você precisa ter as useinstruções index.phpa seguir:

<?php

require './app/bootstrap.php';

use Acme\Auth\User as User;
use Acme\Blog\Comment as Comment;

$user = new User('admin', '$ecurePa$$w0rd1');

$comment = new Comment('<h1>Hello</h1>');
echo $comment->getComment();Linguagem de código:  PHP  ( php )

Resumo

  • Composer é uma ferramenta de gerenciamento de dependências em PHP.
  • Use PSR-4 para organizar diretórios e arquivos de classe.
  • Use o composer dump-autoloadcomando para gerar o autoload.phparquivo.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *