Ir para o conteúdo
Bondry

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.

  1. 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.
  2. 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.
  3. Um módulo quebrado nunca derruba o site. O boot é resiliente: um módulo que estoura é ignorado e o site continua servindo.
  4. Um módulo entrega os próprios arquivos de idioma. Eles ficam em modules/<slug>/resources/lang e são carregados com namespace (slug::arquivo.chave). Nada entra nos arquivos de idioma do core.
  5. Nunca uma chave estrangeira entre módulos. Um módulo pode ser desinstalado enquanto outro roda.
  6. Nenhum build no host do comprador. CSS e JS vão compilados dentro do pacote. Quem roda o build é você, não ele.
  7. 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.meta e 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#