Como criar pacotes reutilizáveis no laravel?
Criar pacotes reutilizáveis no Laravel é uma excelente maneira de modularizar sua aplicação e compartilhar funcionalidades entre projetos. Os pacotes no Laravel podem ser usados para agrupar classes, controladores, migrações, rotas, etc., de uma maneira que seja facilmente reutilizável e configurável.
A seguir, vou explicar como criar um pacote simples para Laravel. Vamos passar por todas as etapas necessárias, desde a estrutura de diretórios até a publicação do pacote.
1. Criação da Estrutura Básica do Pacote
Primeiro, crie uma pasta para o seu pacote dentro da pasta packages
ou vendor
(dependendo de onde você deseja colocá-lo). A estrutura básica de diretórios pode ser algo assim:
/packages
/vendor_name
/package_name
/src
/Console
/Http
/Models
/Controllers
/Migrations
/Views
/Config
/Routes
/Resources
/Translations
/composer.json
/README.md
/ServiceProvider.php
Aqui está o que cada pasta pode conter:
src
: Contém o código principal do pacote (modelos, controladores, etc.).Console
: Para comandos artisan personalizados.Http
: Controladores e middleware.Models
: Modelos Eloquent.Migrations
: Migrations para o banco de dados.Views
: Arquivos de visão Blade.Config
: Arquivos de configuração.Routes
: Arquivos de rotas.Resources
: Arquivos estáticos como CSS, JavaScript, imagens.Translations
: Arquivos de tradução.
2. Criar o composer.json
do Pacote
O arquivo composer.json
define as dependências do pacote e as informações sobre ele. Coloque-o na raiz do diretório do pacote, junto com o código-fonte.
Aqui está um exemplo básico de um arquivo composer.json
:
{
"name": "vendor_name/package_name",
"description": "Descrição do seu pacote",
"type": "library",
"autoload": {
"psr-4": {
"VendorName\\PackageName\\": "src/"
}
},
"require": {
"php": "^7.3",
"illuminate/support": "^8.0"
},
"extra": {
"laravel": {
"providers": [
"VendorName\\PackageName\\ServiceProvider"
],
"aliases": {}
}
}
}
name
: Nome do pacote, geralmente no formatovendor_name/package_name
.autoload
: Define como o Laravel vai autoload os arquivos do seu pacote.extra
: Usado para registrar automaticamente o ServiceProvider e facades quando o pacote for instalado.
3. Criar o ServiceProvider
O ServiceProvider é a parte do pacote onde você registra os serviços, configurações, rotas e outras funcionalidades que o pacote oferece. Crie um arquivo ServiceProvider.php
dentro do diretório src
.
Aqui está um exemplo básico de um ServiceProvider
:
namespace VendorName\PackageName;
use Illuminate\Support\ServiceProvider;
class PackageNameServiceProvider extends ServiceProvider
{
/**
* Bootstrap qualquer serviço.
*
* @return void
*/
public function boot()
{
// Publicar arquivos de configuração
$this->publishes([
__DIR__.'/../config/package_name.php' => config_path('package_name.php'),
], 'config');
// Registrar rotas
$this->loadRoutesFrom(__DIR__.'/../routes/web.php');
// Registrar visualizações
$this->loadViewsFrom(__DIR__.'/../resources/views', 'package_name');
}
/**
* Registra os serviços do pacote.
*
* @return void
*/
public function register()
{
// Aqui você pode vincular suas classes ao container de serviço
}
}
4. Registrar o Pacote no Laravel
Após criar o ServiceProvider
, registre-o no arquivo config/app.php
do Laravel. Porém, se você já usou o campo "extra"
no composer.json
, o Laravel fará isso automaticamente.
Caso contrário, adicione manualmente o ServiceProvider
à chave providers
no config/app.php
:
'providers' => [
// Outros provedores...
VendorName\PackageName\PackageNameServiceProvider::class,
],
5. Configuração e Arquivos Públicos
- Configuração: Para permitir que o usuário do pacote configure opções, crie arquivos de configuração dentro de
config/package_name.php
.Exemplo de um arquivoconfig/package_name.php
:return [ 'option' => env('PACKAGE_OPTION', 'default_value'), ];
- Publicação de Arquivos: Quando o pacote contiver arquivos que o usuário possa querer modificar, você pode permitir que ele publique esses arquivos para o projeto. Isso é feito através do método
publishes
noServiceProvider
(como mostrado acima).Por exemplo, se você tiver um arquivo de configuração que o usuário precise modificar, use o seguinte código no métodoboot()
:$this->publishes([ __DIR__.'/../config/package_name.php' => config_path('package_name.php'), ], 'config');
- Migrations e Assets: Se seu pacote tiver migrations ou arquivos estáticos (como CSS, JavaScript ou imagens), você pode permitir que eles sejam publicados ou carregados no aplicativo Laravel.
6. Criar Rotas e Controladores
Se o seu pacote precisar de rotas ou controladores, crie-os normalmente e, em seguida, registre as rotas no ServiceProvider
.
Exemplo de como registrar rotas no ServiceProvider
:
$this->loadRoutesFrom(__DIR__.'/../routes/web.php');
No arquivo routes/web.php
dentro do seu pacote:
Route::get('/package', 'VendorName\PackageName\Http\Controllers\PackageController@index');
7. Uso de Views e Traduções
Se o pacote tem views Blade ou arquivos de tradução, você pode carregá-los no ServiceProvider
da seguinte forma:
$this->loadViewsFrom(__DIR__.'/../resources/views', 'package_name');
$this->loadTranslationsFrom(__DIR__.'/../resources/lang', 'package_name');
As views e traduções podem ser publicadas para que o usuário do pacote possa personalizá-las:
$this->publishes([
__DIR__.'/../resources/views' => resource_path('views/vendor/package_name'),
], 'views');
8. Testando o Pacote
Depois de criar o pacote, instale-o em sua aplicação Laravel para testar. Para fazer isso, você pode adicionar o repositório do pacote no composer.json
da sua aplicação principal ou, se estiver desenvolvendo o pacote localmente, usar o seguinte comando:
composer require vendor_name/package_name:* --prefer-dist
Se o pacote estiver sendo desenvolvido localmente, você pode usar um caminho de repositório local, como:
"repositories": [
{
"type": "path",
"url": "../caminho/para/seu/pacote"
}
]
Depois, instale o pacote com:
composer update
9. Publicando o Pacote
Quando você estiver pronto para compartilhar o pacote com outros, publique-o no Packagist ou em outro repositório de sua escolha. Isso pode ser feito subindo seu pacote para um repositório Git (por exemplo, GitHub) e registrando-o no Packagist.
Exemplo Completo
Aqui está um exemplo mínimo para ilustrar como criar um pacote básico que registra uma rota simples e um controlador:
Estrutura de Diretórios:
/packages
/vendor_name
/package_name
/src
/Http
/Controllers
PackageController.php
PackageNameServiceProvider.php
/routes
web.php
/composer.json
PackageController.php
:
namespace VendorName\PackageName\Http\Controllers;
use Illuminate\Http\Request;
class PackageController extends Controller
{
public function index()
{
return "Pacote funcionando!";
}
}
ServiceProvider.php
:
namespace VendorName\PackageName;
use Illuminate\Support\ServiceProvider;
class PackageNameServiceProvider extends ServiceProvider
{
public function boot()
{
$this->loadRoutesFrom(__DIR__.'/../routes/web.php');
}
public function register()
{
// Registro de serviços aqui
}
}
web.php
(rotas do pacote):
use VendorName\PackageName\Http\Controllers\PackageController;
Route::get('/package', [PackageController::class, 'index']);
composer.json
do pacote:
{
"name": "vendor_name/package_name",
"autoload": {
"psr-4": {
"VendorName\\PackageName\\": "src/"
}
},
"require": {
"php": "^7.3",
"illuminate/support": "^8.0"
},
"extra": {
"laravel": {
"providers": [
"VendorName\\PackageName\\PackageNameServiceProvider"
]
}
}
}
### Conclusão
Criar pacotes no Laravel envolve a estruturação adequada do diretório, a criação de um `ServiceProvider`, a configuração do `composer.json` e o fornecimento de funcionalidades que podem ser reutilizadas. Depois que o pacote estiver pronto, você pode publicá-lo para fácil reutilização em outros projetos, seja de forma local ou compartilhando-o via repositórios como o Packagist.