Modularizando o Laravel 5

Sem uso de pacotes utilizando os recursos do próprio Framework

Anderson Vinicius
4 min readJun 19, 2017

Lembrando que existem pacotes para fazer modularizarão no Laravel, mas aqui é uma questão de um melhor entendimento sobre o Framework.

Primeiro passo é criar a aplicação com o Laravel 5.3/5.4

$ composer create-project --prefer-dist laravel/laravel laravel-modular-skeleton

Execute o projeto para testar se está tudo funcionando.

$ php artisan serve

Depois de instalado crie uma pasta Core dentro da pasta app e mova todos seus arquivos para esta pasta, ali ficará tudo que é comum entre os módulos.

Quando fizer isso o projeto não estará mais funcionando pois temos que corrigir todos os namespaces que foram afetados.

Verifique todos os arquivos que estão na pasta Core e altere todas as referências de namespace de App\ para App\Core.

Exemplo:

Depois de feita as alterações o projeto ainda não estará funcionando, verifique o arquivo bootstrap/app.php.

Verifique também o arquivo config/app.php que ficam os registros de providers do Laravel.

Pronto! Nesse momento o projeto já estará funcionando, mas ainda precisamos corrigir o arquivo config/auth.php.

O próximo passo é criar uma pasta Modules/Admin dentro da pasta app conforme mostrado na imagem abaixo.

A imagem abaixo é do arquivo que faz as configurações do carregamento do módulo, nele foram carregadas as routes, migrations e views.

Para que as factories do módulo funcionem corretamente é necessário sobrescrever a classe que faz o carregamento delas no Laravel, por padrão as factories eram carregadas da pasta database/factories, agora cada módulo terá seu path de carregamento.

Nesse caso apenas estendi o comportamento padrão da classe Illuminate\Database\Eloquent\Factory.php e fiz a sobrecarga do método load para carregar um array de paths.

Após a criação da classe Factory.php, configure o carregamento das factories dos módulos no arquivo AppServiceProvider.php, assim sobrescrevendo o carregamento padrão.

Crie um controller e uma rota padrão do módulo.

Agora falta criarmos a página principal do módulo, crie o arquivo index.blade.php na pasta Views — poderíamos criar um layout para o módulo ou compartilhar entre os módulos mas isso não cabe ser feito nesse post.

Agora o módulo esta configurado e pronto para uso, vamos registrar ele no Framework.

Pronto! está funcionando, acesse a url http://127.0.0.1:8000/admin e a página principal do módulo é carregada, lembrando que definimos o prefixo admin nas configurações do módulo, então teremos que passar ele ao utilizar partials, components e routes.

Agora você pode copiar essa pasta Admin e criar seus outros módulos, só uma dica que para executar as migrations ou seeders é necessário passar o path de onde se encontra os arquivos.

$ php artisan migrate --path=/app/Modules/Admin/Database/Migrations$ php artisan db:seed --class="App\Modules\Admin\Database\Seeds\DefaultSeeder"

Conclusão

Utilizei apenas recursos do Framework, provavelmente existem melhorias a serem feitas, se tiver alguma sugestão envie no repositório do projeto ou crie um especifico para seu problema.

Poderíamos ainda isolar os resources e tests , dessa forma seria possível adicionar cada módulo do sistema como uma dependência do composer e reaproveita-los entre projetos.

Links úteis

Esse vídeo da uma ideia de desenvolvimento mais modular até chegarmos separar em diferentes servidores os módulos, vale a pena dar uma olhada que tem um pouco a ver com o conteúdo do post, pois da uma ideia de construir aplicações modulares se comunicando via eventos para não acoplar os estados e assim facilitar a separação desses módulos em pacotes.

--

--

Anderson Vinicius

Redução de duplicação de código, alta expressividade e criação no início de abstrações simples. É isso que torna para mim um código limpo. — Ron Jeffries