# Modules

Een feature verpakken met zijn routes, templates, libraries en data.

Een module verpakt een feature: de routes, templates, libraries en de data die hij nodig heeft, in één map. Gebruik er een als de onderdelen bij elkaar horen en als geheel naar een ander project zouden kunnen, zoals een webshop, een ledensysteem of een betaalkoppeling met de bijbehorende 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
```

Een losse template of library heeft geen module nodig. Zet die in `ext/tpl/` of `ext/lib/`.

## Hoe modules laden

Modules in `ext/modules/` en `core/modules/` worden bij elk request gevonden. Hun templates en libraries roep je bij hun naam aan, net als alle andere: `ext/modules/membership/tpl/member-status/index.tpl` is `[#member-status#]`. Hun routes worden deel van de adressen van de site: `ext/modules/membership/uri/join/index.tpl` antwoordt op `/join`. Zoals overal gaat `ext/` vóór `core/`.

Het framework zelf is zo gebouwd. De admin, de API, formulieren, gebruikers en agents zijn modules in `core/modules/`.

## Een module installeren

`.install.inc` draait één keer, als de module wordt geïnstalleerd. Het maakt de resources die de module nodig heeft en registreert de dynamische routes ervan:

```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
```

## Events in modules

Een resource-event noemt een functie volgens een vaste afspraak. Met `"events": {"create": ["member-joined"]}` in de `.meta` van een resource roept Nimbly na elk nieuw record `member_joined($event)` aan uit `lib/member-joined.php` in een module. Zie [Werk op de achtergrond](/nl/docs/guides/jobs/).
