Token (ab MM 2.4)
Das Attribut „Token“ erzeugt beim erstmaligen Speichern eines Datensatzes eine kryptographisch zufällige, unveränderliche Zeichenfolge (Token). Typische Einsatzbereiche:
Eindeutige Bestellnummern oder Vorgangsnummern (z. B.
TKN-aB3xYqUK)Zugangsschlüssel oder Freigabe-Links im Frontend
Interne Referenz-IDs, die stabil bleiben müssen
Das Token wird genau einmal generiert — beim ersten Speichern, solange das Feld noch
leer ist. Jede weitere Speicherung des Datensatzes lässt den bestehenden Token
unverändert. Auch ein direkter Aufruf von setDataFor() überschreibt einen
vorhandenen Token nicht (Write-once-Schutz auf Datenbankebene).
Bemerkung
Das Token ist immer eindeutig. Die Option „Eindeutige Werte“ in den allgemeinen Attribut-Einstellungen ist deshalb fest aktiv und kann nicht deaktiviert werden.
Warnung
Beim Duplizieren (Kopieren) eines Datensatzes im Backend wird kein Token übernommen. Das neue Item erhält beim Speichern automatisch einen eigenen, neuen Token.
Installation
Das Attribut wird über den Contao Manager oder Composer installiert:
composer require metamodels/attribute_token
Einstellungen beim Anlegen des Attributs
Neben den allgemeinen Attribut-Einstellungen (Name, Spaltenname, Beschreibung, Varianten überschreiben) bietet das Token-Attribut folgende spezifische Optionen:
Option |
Beschreibung |
|---|---|
Zeichensatz für Token |
Zeichen, die für die zufällige Generierung verwendet werden. Mögliche Eingaben:
Standard: |
Zeichenlänge des Tokens |
Anzahl der zufällig generierten Zeichen (Mindestwert: 3, Standard: 8). |
Präfix des Tokens |
Optionaler fester Text, der jedem Token vorangestellt wird
(z. B. |
Beispiele für eindeutige Bezeichnungen sind die Vorgaben bei deutschen Ausweisen und Pässen mit aktuell den Zeichen 123456789CFGHJKMNPRTVWXYZ und einer Länge
von 26 Zeichen oder den Record Locator wie man ihn von Flugtickets
kennt mit sechs Zeichen aus 23456789ABCDEFGHJKMNPQRSTXYZ - auf 0, 1, O, I, L wird zur besseren Lesbarkeit verzichtet.
Die Anzahl der möglichen Kombinationen V ergibt sich aus der Anzahl der möglichen Zeichen n und der Zeichenlänge
des Tokens k - die Formel ist V = n**k.
Bei der Standardeinstellung [a-z][A-Z][0-9] sind es 62 Zeichen n und einer Zeichenlänge k von 8 ergeben
sich ca. 218 Billionen Kombinationsmöglichkeiten - bei drei Zeichen sind es nur 238.328.
Einstellungen bei den Render-Einstellungen
Das Token-Attribut besitzt keine eigenen Render-Einstellungen. In der Attributliste einer Render-Einstellung stehen die üblichen Optionen zur Verfügung:
Option |
Beschreibung |
|---|---|
Template |
Auswahl eines eigenen Templates für die Ausgabe des Token-Wertes. Wird kein Template angegeben, erfolgt die Ausgabe als einfacher Text. |
CSS-Klasse |
Optionale CSS-Klasse, die dem Ausgabeelement hinzugefügt wird. |
Einstellungen bei der Eingabemaske
Wird das Token-Attribut einer Eingabemaske hinzugefügt, ist das Feld im Backend
grundsätzlich schreibgeschützt (readonly). Folgende Optionen stehen zur Verfügung:
Darstellung
Option |
Beschreibung |
|---|---|
Backend-Klasse |
CSS-Klassen für die Darstellung des Feldes im Backend-Formular (z. B.
|
Übersicht (Backend-Suche)
Option |
Beschreibung |
|---|---|
Suchbar |
Das Attribut steht im Backend als Suchfeld zur Verfügung. |
Bemerkung
Die Optionen „Pflichtfeld“, „Immer speichern“ und „Filterbar“ stehen für das Token-Attribut nicht zur Verfügung, da das Feld intern immer gespeichert wird und schreibgeschützt ist.
Filterregeln
Das Token-Attribut kann mit folgenden Filterregeln verwendet werden:
Filterregel |
Hinweis |
|---|---|
Einfache Abfrage |
Filtert Datensätze nach einem exakten Token-Wert; sinnvoll für
URL-basierte Zugangsprüfungen |
Eigenes SQL |
Für komplexere Filterungen für Kombinationen mit weiteren Parametern . |
Sonderfunktionen
Konfiguration per config.yaml
Die maximale Anzahl der Generierungsversuche, bevor eine Ausnahme ausgelöst wird,
kann projektspezifisch in der config/config.yaml angepasst werden:
1meta_models_attribute_token:
2 max_retries: 5 # Standard: 3
Bei jedem Versuch wird geprüft, ob der generierte Token bereits in der Datenbank
vorhanden ist. Schlägt die Eindeutigkeitsprüfung dreimal (oder so oft wie konfiguriert)
fehl, wird eine RuntimeException geworfen.
Eigene Token-Generierung per Event
Über den Event MetaModels\AttributeTokenBundle\Event\GenerateTokenEvent kann die
Token-Generierung durch eigenen Code ersetzt oder erweitert werden. Wird im Listener
setToken() aufgerufen, überspringt MetaModels die eingebaute Zufallsgenerierung.
Beispiel-Listener als src/EventListener/MyTokenListener.php:
1<?php
2
3use MetaModels\AttributeTokenBundle\Event\GenerateTokenEvent;
4
5class MyTokenListener
6{
7 public function onGenerateToken(GenerateTokenEvent $event): void
8 {
9 $prefix = $event->getAttribute()->get('token_prefix') ?? '';
10 $event->setToken($prefix . strtoupper(bin2hex(random_bytes(8))));
11 }
12}
Registrierung in config/services.yaml:
1App\EventListener\MyTokenListener:
2 tags:
3 - name: kernel.event_listener
4 event: MetaModels\AttributeTokenBundle\Event\GenerateTokenEvent
5 method: onGenerateToken
Die verfügbaren Methoden des Events:
Methode |
Beschreibung |
|---|---|
|
Gibt das Token-Attribut zurück (Zugriff auf Zeichensatz, Länge, Präfix). |
|
Das MetaModel-Item, das gerade gespeichert wird. |
|
Setzt einen eigenen Token; verhindert die eingebaute Generierung. |
|
Gibt den vom Listener gesetzten Token zurück, oder |
|
|
Write-once-Schutz auf Datenbankebene
Auch wenn setDataFor() direkt aufgerufen wird, überschreibt MetaModels einen
bereits vorhandenen Token-Wert nicht. Die UPDATE-Abfrage enthält eine Bedingung
WHERE spalte IS NULL OR spalte = '', sodass ein befülltes Feld immer unverändert
bleibt.
Datenbank-Speicherung
Der Token wird als varchar(255) NULL in der MetaModel-Tabelle gespeichert. Ein
leerer Wert wird als NULL abgelegt (kompatibel mit MySQL Strict Mode).