# 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.

```text
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
<?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;
```

```bash
./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](/pt/docs/guides/jobs/).
