Conceitos
Módulos
Empacotar uma funcionalidade com suas rotas, templates, bibliotecas e dados.
Um módulo empacota uma funcionalidade: suas rotas, templates, bibliotecas e os dados de que precisa, numa única pasta. Use um quando as partes andam juntas e poderiam ir para outro projeto como uma unidade, como uma loja, um sistema de membros ou uma integração de pagamento com seu webhook.
ext/modules/membership/
.install.inc creates resources and registers routes
lib/ libraries of the module
tpl/ templates of the module
uri/ routes of the module
Um template ou uma biblioteca isolada não precisa de módulo. Coloque-os em ext/tpl/ ou ext/lib/.
Como os módulos carregam
Os módulos em ext/modules/ e core/modules/ são encontrados a cada requisição. Seus templates e bibliotecas são chamados pelo nome como quaisquer outros: ext/modules/membership/tpl/member-status/index.tpl é [#member-status#]. Suas rotas entram no espaço de endereços do site: ext/modules/membership/uri/join/index.tpl responde em /join. Como em todo lugar, ext/ vem antes de core/.
O próprio framework é construído assim. O admin, a API, os formulários, os usuários e os agentes são módulos em core/modules/.
Instalando um módulo
O .install.inc roda uma vez, quando o módulo é instalado. Ele cria os recursos de que o módulo precisa e registra suas rotas dinâmicas:
<?php
load_library('data');
$result = data_create_resource('members', [
'fields' => [
'name' => ['name' => 'Name', 'type' => 'text', 'required' => true],
'email' => ['name' => 'Email', 'type' => 'email', 'required' => true],
],
]);
$route = 'members/(id)';
$result &= data_exists('.routes', md5($route))
|| data_create('.routes', md5($route), ['route' => $route, 'order' => 200]);
return $result;
./nimbly module:install membership
Eventos de módulo
Um evento de recurso nomeia uma função por convenção. Com "events": {"create": ["member-joined"]} no .meta de um recurso, o Nimbly chama member_joined($event) de lib/member-joined.php num módulo após cada novo registro. Veja Trabalho em segundo plano.