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:
Recomendados pelo LinkedIn
<?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:
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.