Modularizando o Laravel 5
Sem uso de pacotes utilizando os recursos do próprio Framework
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.