Olá Pessoal,

Hoje estou iniciando uma série de novos posts sobre criação de módulos para o Bagisto.

Nesse primeiro post, será feito a criação de um módulo base. Nesse módulo irá conter o básico para um módulo funcionar. Esse post será tomado como base para futuros tutorias referentes a criação de funcionalidades para um módulo.

Então vamos lá?

Criação das pastas do módulo

A pasta packages localizada na raíz da aplicação, será responsável por agrupar todos os módulos criados para o bagisto

Dentro da pasta packages que se encontra na raíz da aplicação, crie uma pasta com o nome do Vendor do módulo. E dentro da pasta do Vendor, crie uma pasta com o nome do módulo. Conforme imagem abaixo:

No exemplo acima, o vendor da aplicação se chamará VendorName, e o nome do módulo se chamará PackageName.

Para que o módulo seja disponibilizado por instalação via composer, é necessário criar um arquivo chamado composer.json, dentro da pasta do módulo (nesse exemplo, vai ser na pasta PackageName) com o conteúdo abaixo:

{
    "name": "vendor_name/package_name",
    "description": "description",
    "minimum-stability": "stable",
    "license": "proprietary",
    "authors": [
        {
            "name": "Author Name",
            "email": "email@example.com"
        }
    ],
    "autoload": {
        "psr-4": {
            "VendorName\\PackageName\\": "src/"
        }
    }
}

Após criar o arquivo do composer, crie uma pasta chamada src dentro da pasta PackageName. A estrutura ficará assim:

Dentro dessa pasta src ficará todo o conteúdo do referente ao módulo.

Criando o arquivo ServiceProvider

esse arquivo será neceśsario para que sejam adicionados, informações de rotas, views, e outros arquivos da aplicação. Para criar esse arquivo, crie uma nova pasta chamada Providers dentro da pasta src. Dentro dessa pasta crie uma arquivo com a nomenclatura: Nome do Módulo + ServiceProvider . Nesse nosso exemplo, o nome do arquivo será: PackageNameServiceProvider. Pois nosso módulo se chama PackageName. Nesse arquivo inisira o seguinte código:

<?php
namespace VendorName\PackageName\Providers;

use Illuminate\Support\ServiceProvider;

class PackageNameServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap Services
     */
    public function boot()
    {

    }

    /**
     * Register Services
     */
    public function register()
    {

    }
}

Nesse arquivo será feito a chamada de arquivos como: menu, routes, views. Para que o módulo consiga encontrar esses arquivos corretamente.

Agora abra o arquivo app.php localizado em: config/app.php. A pasta config está localizada na raíz da aplicação. Dentro desse arquivo localize o array de providers e insira dentro do array a seguinte chave:

VendorName\PackageName\Providers\PackageNameServiceProvider::class,

Essa inserção somente será necessário ser feita durante o desenvolvimento do módulo. Pois esse Provider será inserido dentro do composer.json do módulo. Assim, quando ele for instalado via composer, não será necessário efetuar essa adição manualmente.

Abra o arquivo composer.json localizado na pasta PackageName e inisira o seguinte código logo após o autoload:

"extra": {
    "laravel": {
        "providers": [
            "VendorName\\PackageName\\Providers\\PackageNameServiceProvider"
        ],
        "aliases": {}
    }
},

fazendo isso o arquivo ficará mais ou menos assim:

{
    "name": "vendor_name/package_name",
    "description": "description",
    "minimum-stability": "stable",
    "license": "proprietary",
    "authors": [
        {
            "name": "Author Name",
            "email": "email@example.com"
        }
    ],
    "autoload": {
        "psr-4": {
            "VendorName\\PackageName\\": "src/"
        }
    },
    "extra": {
        "laravel": {
            "providers": [
                "VendorName\\PackageName\\Providers\\PackageNameServiceProvider"
            ],
            "aliases": {}
        }
    }
}

A estrutura final do módulo base, ficou assim:

Agora abra o arquivo composer.json do projeto bagisto, e adicione a seguinte linha no autoload psr-4

"psr-4": {
    "VendorName\\PackageName\\": "packages/VendorName/PackageName/src"
}

Fazendo isso o bagisto começara a reconhecer o namespace, e não dará o erro de classes não encontradas.

Seguindo o tutorial acima, um módulo base para o Bagisto está criado.

Caso deseje baixar o módulo, o mesmo está disponível no seguinte repositório:

https://github.com/luancschmitz/bagisto-modulo-base/tree/1.0

Espero que tenham gostado desse pequeno tutorial!!