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 formato vendor_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 arquivo config/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 no ServiceProvider (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étodo boot():
    $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.

Posts Similares