Desenvolvimento de Pacotes Laravel: Criando e Publicando no Packagist

Desenvolvimento de Pacotes Laravel: Criando e Publicando no Packagist

No mundo do desenvolvimento em Laravel, a criação de pacotes pode economizar tempo e esforço, além de promover a reutilização de código entre projetos. Neste artigo, mostrarei como criar um pacote Laravel que adiciona funcionalidades avançadas de auditoria e logging para suas aplicações, e como publicá-lo no Packagist.

1. Configurando o Ambiente

Primeiramente, crie um novo diretório para o seu pacote:

mkdir laravel-advanced-logger
cd laravel-advanced-logger        

Dentro deste diretório, inicialize um novo projeto Composer:

composer init        

Preencha as informações solicitadas, como o nome do pacote, descrição e autor.

2. Estrutura do Pacote

Estruture o pacote seguindo as convenções de Laravel:

laravel-advanced-logger/
├── src/
│   ├── AdvancedLoggerServiceProvider.php
│   ├── Http/
│   │   └── Middleware/
│   │       └── LogRequests.php
│   ├── Models/
│   │   └── LogEntry.php
│   ├── Traits/
│   │   └── Loggable.php
├── config/
│   └── advancedlogger.php
├── migrations/
│   └── 2024_06_06_000000_create_log_entries_table.php
├── composer.json
├── README.md
└── tests/
    └── ExampleTest.php        

3. Criando o Service Provider

O ServiceProvider é a principal entrada do seu pacote. Crie o arquivo AdvancedLoggerServiceProvider.php dentro da pasta src:

<?php

namespace YourVendor\AdvancedLogger;

use Illuminate\Support\ServiceProvider;

class AdvancedLoggerServiceProvider extends ServiceProvider
{
    public function register()
    {
        $this->mergeConfigFrom(__DIR__.'/../config/advancedlogger.php', 'advancedlogger');
    }

    public function boot()
    {
        $this->publishes([
            __DIR__.'/../config/advancedlogger.php' => config_path('advancedlogger.php'),
        ]);

        $this->loadMigrationsFrom(__DIR__.'/../migrations');
    }
}        

4. Configuração

Crie o arquivo de configuração config/advancedlogger.php:

<?php

return [
    'log_requests' => true,
];        

5. Middleware para Log de Requisições

Crie o middleware src/Http/Middleware/LogRequests.php:

<?php

namespace YourVendor\AdvancedLogger\Http\Middleware;

use Closure;
use YourVendor\AdvancedLogger\Models\LogEntry;

class LogRequests
{
    public function handle($request, Closure $next)
    {
        if (config('advancedlogger.log_requests')) {
            LogEntry::create([
                'method' => $request->method(),
                'url' => $request->url(),
                'ip_address' => $request->ip(),
                'user_agent' => $request->header('User-Agent'),
                'created_at' => now(),
            ]);
        }

        return $next($request);
    }
}        

6. Modelo para Entradas de Log

Crie o modelo src/Models/LogEntry.php:

<?php

namespace YourVendor\AdvancedLogger\Models;

use Illuminate\Database\Eloquent\Model;

class LogEntry extends Model
{
    protected $fillable = [
        'method', 'url', 'ip_address', 'user_agent', 'created_at'
    ];

    public $timestamps = false;
}        

7. Trait para Log de Mudanças em Modelos

Crie a trait src/Traits/Loggable.php:

<?php

namespace YourVendor\AdvancedLogger\Traits;

use Illuminate\Database\Eloquent\Model;
use YourVendor\AdvancedLogger\Models\LogEntry;

trait Loggable
{
    public static function bootLoggable()
    {
        static::updated(function (Model $model) {
            LogEntry::create([
                'method' => 'UPDATE',
                'url' => request()->url(),
                'ip_address' => request()->ip(),
                'user_agent' => request()->header('User-Agent'),
                'created_at' => now(),
                'changes' => json_encode($model->getChanges()),
            ]);
        });
    }
}        

8. Migração para a Tabela de Logs

Crie a migração migrations/2024_06_06_000000_create_log_entries_table.php:

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateLogEntriesTable extends Migration
{
    public function up()
    {
        Schema::create('log_entries', function (Blueprint $table) {
            $table->id();
            $table->string('method');
            $table->string('url');
            $table->string('ip_address');
            $table->string('user_agent');
            $table->json('changes')->nullable();
            $table->timestamp('created_at');
        });
    }

    public function down()
    {
        Schema::dropIfExists('log_entries');
    }
}        

9. Publicando o Pacote

Para publicar seu pacote no Packagist:

  1. Crie um repositório no GitHub e envie seu código para lá.
  2. Vá até o Packagist e faça login.
  3. Clique em "Submit" e forneça a URL do repositório GitHub.

10. Instalando o Pacote em um Projeto Laravel Existente

Depois de publicar seu pacote no Packagist, você pode instalá-lo em qualquer projeto Laravel usando o Composer. Aqui estão os passos para instalar e configurar o pacote laravel-advanced-logger em um projeto Laravel existente.

Passo 1: Instalação via Composer

No terminal, navegue até o diretório do seu projeto Laravel e execute o comando abaixo para instalar o pacote:

composer require yourvendor/laravel-advanced-logger        

Substitua yourvendor pelo seu namespace, que normalmente é o nome do autor ou da organização.

Passo 2: Configuração no Laravel

Depois de instalar o pacote, você precisa registrar o ServiceProvider do pacote no seu arquivo config/app.php. No entanto, Laravel 5.5 e superior suportam a descoberta automática de pacotes, então isso geralmente não é necessário. Se você estiver usando uma versão mais antiga do Laravel, adicione manualmente:

'providers' => [
    // Outros Service Providers
    YourVendor\AdvancedLogger\AdvancedLoggerServiceProvider::class,
],        

Passo 3: Publicar Arquivos de Configuração e Migrações

Para garantir que todas as configurações e migrações sejam corretamente copiadas para o seu projeto, execute os comandos abaixo:

php artisan vendor:publish --provider="YourVendor\AdvancedLogger\AdvancedLoggerServiceProvider" --tag=config
php artisan vendor:publish --provider="YourVendor\AdvancedLogger\AdvancedLoggerServiceProvider" --tag=migrations        

Passo 4: Executar Migrações

Após publicar as migrações, execute o comando abaixo para criar a tabela de logs no banco de dados:

php artisan migrate        

Passo 5: Utilização do Pacote

Com a instalação concluída, você pode começar a utilizar as funcionalidades do pacote laravel-advanced-logger. Por exemplo, para ativar o middleware de logging de requisições, adicione a classe LogRequests ao seu kernel HTTP:

// app/Http/Kernel.php

protected $middlewareGroups = [
    'web' => [
        // Outros middlewares
        \YourVendor\AdvancedLogger\Http\Middleware\LogRequests::class,
    ],
];        

Para usar a trait Loggable em um modelo, adicione-a ao modelo desejado:

// app/Models/User.php

use YourVendor\AdvancedLogger\Traits\Loggable;

class User extends Authenticatable
{
    use Loggable;

    // ...
}        

Conclusão

Criar pacotes Laravel permite que você compartilhe funcionalidades úteis com a comunidade e reutilize código de maneira eficiente. Com este guia, você aprendeu a criar um pacote avançado de logging e auditoria, publicá-lo no Packagist e instalá-lo em um projeto Laravel existente. Lembre-se de manter o código limpo e bem documentado para facilitar a manutenção e o uso por outros desenvolvedores.

Se este artigo foi útil para você, não hesite em deixar um comentário ou compartilhar suas próprias experiências com o desenvolvimento de pacotes Laravel.

Entre para ver ou adicionar um comentário

Outras pessoas também visualizaram

Conferir tópicos