---
url: 'https://dxpr.com/nl/hc/documentation/learn-dxpr-builder/development/api'
title: 'Architectuur | DXPR'
author:
  name: Jurriaan
  url: 'https://dxpr.com/users/jurriaan'
date: '2026-10-24T02:33:04+00:00'
updated: '2026-10-24T09:09:48+00:00'
copyright: 'Copyright DXPR. All rights reserved.'
type: article
summary: |-
  De PHP-services, JavaScript-extensiepunten en routes die
  DXPR Builder definieert. Service-ID's komen uit
  dxpr_builder.services.yml, routes uit
  dxpr_builder.routing.yml. Voor de aanvraag- en
  antwoorddetails van elke route, zie
  API-endpoints.
tags:
  - 'Architectuur en API’s'
image: 'https://dxpr.com/themes/custom/dxpr_com/images/dxpr-share-card.jpg'
published: true
og:
  site_name: DXPR
  updated_time: '2026-10-24T09:09:48+0000'
  'image:alt': 'DXPR, powered by Drupal: AI-powered Drupal for marketers.'
schema:
  '@context': 'https://schema.org'
  '@graph':
    -
      mainEntity: {  }
    -
      '@type': TechArticle
      headline: Architectuur
      description: |-
        De PHP-services, JavaScript-extensiepunten en routes die
        DXPR Builder definieert. Service-ID's komen uit
        dxpr_builder.services.yml, routes uit
        dxpr_builder.routing.yml. Voor de aanvraag- en
        antwoorddetails van elke route, zie
        API-endpoints.
      image:
        '@type': ImageObject
        url: 'https://dxpr.com/themes/custom/dxpr_com/images/dxpr-share-card.jpg'
        width: '1200'
        height: '630'
      datePublished: '2026-10-24T02:33:04+0000'
      dateModified: '2026-10-24T09:09:48+0000'
      author:
        '@type': Organization
        '@id': 'https://dxpr.com/#organization'
        name: DXPR
        url: 'https://dxpr.com/'
        logo:
          '@type': ImageObject
          url: 'https://dxpr.com/themes/custom/dxpr_com/dxpr-logo-dark.svg'
          width: '1348'
          height: '501'
      publisher:
        '@type': Organization
        '@id': 'https://dxpr.com/#organization'
        name: DXPR
        url: 'https://dxpr.com/'
        logo:
          '@type': ImageObject
          url: 'https://dxpr.com/themes/custom/dxpr_com/dxpr-logo-dark.svg'
          width: '1348'
          height: '501'
      mainEntityOfPage: 'https://dxpr.com/nl/hc/documentation/learn-dxpr-builder/development/api'
      articleSection: 'Architectuur en API’s'
    -
      '@type': WebPage
      '@id': 'https://dxpr.com/nl/hc/documentation/learn-dxpr-builder/development/api'
      description: |-
        De PHP-services, JavaScript-extensiepunten en routes die
        DXPR Builder definieert. Service-ID's komen uit
        dxpr_builder.services.yml, routes uit
        dxpr_builder.routing.yml. Voor de aanvraag- en
        antwoorddetails van elke route, zie
        API-endpoints.
      breadcrumb:
        '@type': BreadcrumbList
        itemListElement:
          -
            '@type': ListItem
            position: 1
            name: Home
            item: 'https://dxpr.com/nl'
      publisher:
        '@type': Organization
        '@id': 'https://dxpr.com/#organization'
        name: DXPR
      inLanguage: nl
---
[Help Center](/nl/hc)/[Documentatie](/nl/hc/documentatie) /[Learn DXPR Builder](/hc/documentation/learn-dxpr-builder) /[Extend](/hc/documentation/learn-dxpr-builder/extend) /[Architectuur en API’s](/hc/documentation/learn-dxpr-builder/extend/architecture) # Architectuur.

 Learn DXPR BuilderExtendArchitectuur en API’s

   ## In this guide

De PHP-services, JavaScript-extensiepunten en routes die DXPR Builder definieert. Service-ID's komen uit `dxpr_builder.services.yml`, routes uit `dxpr_builder.routing.yml`. Voor de aanvraag- en antwoorddetails van elke route, zie [API-endpoints](/nl/hc/documentation/learn-dxpr-builder/reference/api-endpoints).

## PHP-services

| Service-ID | Klasse (in `src/`) | Doel |
|---|---|---|
| `dxpr_builder.service` | `Service\DxprBuilderService` | Bereidt builderinhoud voor op output, behandelt padtokens, bouwt het pictogrammensetregister |
| `dxpr_builder.license_service` | `Service\DxprBuilderLicenseService` | Licentiestatus, factureerbare gebruikers, editorsynchronisatie door DXPR |
| `dxpr_builder.key_service` | `Service\DxprBuilderKeyService` | Leest en bewaart de productsleutel |
| `dxpr_builder.jwt_decoder` | `Service\DxprBuilderJWTDecoder` | Decodeert de payload van de productsleutel |
| `dxpr_builder.user_settings` | `Service\UserSettings` | De eigen editorinstellingen van elke redacteur, bewaard in gebruikersdata |
| `dxpr_builder.content_lock` | `Service\ContentLock` | Legt vast welke gebruiker een entiteitsrevisie bewerkt |
| `dxpr_builder.content_migration` | `Service\ContentMigrationService` | Draait inhoudsmigraties; verzamelt services met de tag `dxpr_builder.content_migration` |
| `dxpr_builder.profile_handler` | `Service\Handler\ProfileHandler` | Zet een profiel om naar editorinstellingen |
| `dxpr_builder.handler.block` | `Service\Handler\BlockHandler` | Rendert Drupal-blokken geplaatst als elementen |
| `dxpr_builder.handler.view` | `Service\Handler\ViewHandler` | Rendert Views-displays geplaatst als elementen |
| `dxpr_builder.template_image_validator` | `Service\TemplateImageValidator` | Valideert voorbeeldafbeeldingen van sjablonen |
| `dxpr_builder.rl_variant.extractor`, `dxpr_builder.rl_variant.registrar` | `RlIntegration\Service\*` | A/B-testvarianten; inactief zonder de RL-module |
| `dxpr_builder.rl_sort.extractor`, `dxpr_builder.rl_sort.registrar` | `RlIntegration\Service\*` | Smart-sort-experimenten; inactief zonder de RL-module |
| `logger.channel.dxpr_builder` | core logger channel | Logkanaal `dxpr_builder` |

### DxprBuilderServiceInterface

Geïmplementeerd door `dxpr_builder.service`. De methoden die je het meest waarschijnlijk aanroept:

- `insertBaseTokens($content)`: vervangt de basis-URL van deze site, de filesmap en het modulepad met tokens. De editor bewaart inhoud in deze vorm.
- `replaceBaseTokens(&$content): void`: breidt de tokens weer uit naar URL's voor de huidige omgeving.
- `stripHtmlElementPersists(string $markup): string`: verwijdert de `data-az-persist`-attributen. Draai hem op markup geschreven buiten de editor; de editor herbouwt ze bij laden.
- `getCmsElementNames()`: de blokken en Views-displays aangeboden als elementen, gecachet.
- `getIconSets(): array`: het pictogrammensetregister na YAML-discovery en `hook_dxpr_builder_icon_sets_alter()`.

```php
$markup = \Drupal::service('dxpr_builder.service')->insertBaseTokens($html);

```

### DxprBuilderLicenseServiceInterface

Geïmplementeerd door `dxpr_builder.license_service`.

- `isBillableUser(?AccountInterface $account = NULL): bool`: TRUE voor gebruiker 1 en voor actieve accounts met `edit with dxpr builder` die niet zijn uitgesloten van DXPR Builder-bewerken.
- `getLicenseInfo()`: licentiestatus van de DXPR-licentieserver, gecachet. Zonder productsleutel geeft hij de gratis tier terug: één gebruiker en 100 contentitems.
- `syncAllUsersWithCentralStorage(string $operation, string $json_web_token = ''): void`: stuurt de redacteurs van deze site naar DXPR. `$operation` is een van de interfaceconstanten `DXPR_USER_SYNC_OPERATION` (`sync`), `DXPR_USER_ADD_OPERATION` (`add`) of `DXPR_USER_REMOVE_OPERATION` (`remove`).

### DxprBuilderKeyService

- `getApiKey(): ?string`: de productsleutel. Wanneer de instelling `api_key_storage` `key` is, leest hij de Key-entiteit genoemd in `key_provider`; anders leest hij `json_web_token`.
- `setApiKey(string $key_value, string $storage_type = 'config', ?string $selected_key_id = NULL): void`: bewaart de sleutel in config of in een Key-entiteit.

### DxprBuilderJWTDecoder

- `decodeJwt(string $access_token)`: geeft de claims `sub`, `scope` en `dxpr_tier` van de productsleutel terug, elk NULL wanneer het token niet kan worden gelezen. Het resultaat is gecachet per token.

## JavaScript-extensiepunten

De editorscripts delen twee arrays op `window.dxprBuilder`. Push je eigen objecten erop tussen het script dat de array maakt en `dxpr_builder.js`, dat ze één keer leest wanneer het draait.

| Array | Gemaakt door | Wat `dxpr_builder.js` ermee doet |
|---|---|---|
| `dxpr_param_types` | `dxpr_param_types.js` | Registreert elk object als parametertype met `register_param_type()` |
| `dxpr_elements` | `dxpr_elements.js` | `create_dxpr_elements()` registreert elke definitie met `register_animated_element()` en converteert zijn `params` met `make_param_type()` |

De parametertypen die de module registreert zijn `boxmodel`, `checkbox`, `checkboxes`, `colorpicker`, `datetime`, `dropdown`, `dxb_slider`, `html`, `icon`, `image`, `images`, `link`, `links`, `numericfield`, `row_layout`, `saved_datetime`, `social_links`, `textarea`, `textfield` en `video`. Een parameter met een onbekende `type` rendert als een gewone tekstinput.

[Aangepaste elementen](/nl/hc/documentation/learn-dxpr-builder/development/custom-elements) toont een complete elementdefinitie en hoe je die op het juiste moment laadt.

## Editorroutes

Toegangslegende: **billable** is de `_dxpr_builder_billable_user`-controle (gebruiker 1, of een actief account met `edit with dxpr builder` dat niet is uitgesloten); **CSRF** is `_csrf_token`.

| Pad | Routenaam | Methoden | Toegang |
|---|---|---|---|
| `/dxpr_builder/ajax` | `dxpr_builder.ajax_callback` | alle | billable, CSRF |
| `/dxpr_builder/ajax/file_upload` | `dxpr_builder.ajax_file_upload_callback` | POST, DELETE | billable, CSRF |
| `/dxpr_builder/ajax/ai/chat` | `dxpr_builder.ai_chat` | POST | `edit with dxpr builder`, billable, CSRF |
| `/dxpr_builder/ajax/ai/image` | `dxpr_builder.ai_image` | POST | `edit with dxpr builder`, billable, CSRF |
| `/dxpr_builder/ajax/ai/image/edit` | `dxpr_builder.ai_image_edit` | POST | `edit with dxpr builder`, billable, CSRF |
| `/dxpr_builder/csrf` | `dxpr_builder.csrf_refresh` | alle | billable |
| `/dxpr_builder/ajax/help_link_validator` | `dxpr_builder.ajax_help_link_validator` | alle | billable |
| `/dxpr_builder/media-library` | `dxpr_builder.media_library` | alle | `view media` |
| `/dxpr_builder/entity-link-suggestions` | `dxpr_builder.entity_link_suggestions` | GET | `edit with dxpr builder`, CSRF |
| `/dxpr_builder/user-settings` | `dxpr_builder.user_settings` | POST | `edit with dxpr builder`, CSRF |

## Adminroutes

Alle adminpagina's staan onder **DXPR Studio &gt; DXPR Builder**. De kolom Tab toont het label in het adminmenu.

| Pad | Tabblad | Recht |
|---|---|---|
| `/admin/dxpr_studio` | DXPR Studio | `administer dxpr builder configuration` |
| `/admin/dxpr_studio/dxpr_builder` | DXPR Builder | `administer dxpr builder configuration` |
| `/admin/dxpr_studio/dxpr_builder/settings` | General Settings | `administer dxpr builder configuration` |
| `/admin/dxpr_studio/dxpr_builder/ai_settings` | AI | `administer dxpr builder configuration` |
| `/admin/dxpr_studio/dxpr_builder/content` | Content Items | `administer dxpr builder configuration` |
| `/admin/dxpr_studio/dxpr_builder/migration-status` | Migrations (under Content Items) | `administer dxpr builder configuration` |
| `/admin/dxpr_studio/dxpr_builder/page_template` | Page Templates | `administer site configuration` |
| `/admin/dxpr_studio/dxpr_builder/user_licenses` | User Licenses | `administer dxpr builder configuration` |
| `/admin/dxpr_studio/dxpr_builder/profile` | User Profiles | `administer dxpr_builder_profile` |
| `/admin/dxpr_studio/dxpr_builder/user_templates` | User Templates | `administer site configuration` |