Desenvolvendo para o Bondry
O que é um módulo, o que é um tema, e as regras que valem para os dois antes de você escrever uma linha.
O Bondry é uma aplicação Laravel com um kernel que carrega módulos e temas em tempo de execução. Tudo o que você constrói é um diretório com um manifesto, empacotado num zip e instalado pelo painel.
As duas coisas que você pode construir#
| Artefato | Fica em | Manifesto |
|---|---|---|
| Módulo | modules/<slug>/ |
module.json |
| Tema | themes/<slug>/ |
theme.json |
Um pacote de idioma é um terceiro tipo de pacote, mas ele leva só arquivos de
tradução e um language.json, e não precisa de código.
As regras que não dobram#
Elas são impostas pelo kernel, e não por convenção. Um pacote que as quebra é recusado na instalação.
- Um módulo é dono só das tabelas dele. Elas têm o prefixo
mod_<slug>_, com hífen virando underscore. Ler dado do core é permitido; criar, alterar ou remover qualquer coisa fora desse prefixo, não. - Desinstalar remove só o módulo. Ele apaga as tabelas dele e os registros de migração dele. O core não é tocado, então reinstalar começa do zero.
- Um módulo quebrado nunca derruba o site. O boot é resiliente: um módulo que estoura é ignorado e o site continua servindo.
- Um módulo entrega os próprios arquivos de idioma. Eles ficam em
modules/<slug>/resources/lange são carregados com namespace (slug::arquivo.chave). Nada entra nos arquivos de idioma do core. - Nunca uma chave estrangeira entre módulos. Um módulo pode ser desinstalado enquanto outro roda.
- Nenhum build no host do comprador. CSS e JS vão compilados dentro do pacote. Quem roda o build é você, não ele.
- Nenhum script inline. O produto roda uma CSP estrita. Comportamento vive no seu arquivo JS empacotado.
Estender sem tocar no core#
Dois mecanismos, e você vai usar os dois:
- Eventos para comportamento. O kernel e os módulos disparam eventos como o
cadastro de um membro ou a criação de um post; você escuta no seu
boot(). - Slots de interface para UI. O core declara slots (
admin.menu,profile.tabs,search.sources,head.metae outros) e qualquer módulo pode preenchê-los.
Nada exige editar um arquivo do core, e um módulo que editar um vai perder a edição no próximo update.
Proteger uma integração entre módulos#
Um módulo nunca sabe se outro está instalado. Pergunte, não presuma:
PHP
if (class_exists(\App\Support\Breadcrumbs::class)) {
\App\Support\Breadcrumbs::push(__('directory::labels.title'), route('directory.index'));
}
if (\Illuminate\Support\Facades\Route::has('lms.catalog')) {
// Ofereça a integração só quando o LMS estiver lá.
}
Para onde ir agora#
- Anatomia de um módulo para a pasta e o manifesto.
- Regras de independência para o detalhe por trás da lista acima.
- Rotas, permissões e telas de administração para ligar um módulo ao painel.
- Temas para o contrato de tema.
- Empacotamento e formato de versão quando estiver pronto para publicar.