PHPackages                             netgroup/datatransformationlayer - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. netgroup/datatransformationlayer

ActiveContao-bundle[Utility &amp; Helpers](/categories/utility)

netgroup/datatransformationlayer
================================

Es handelt sich um eine Erweiterung für das Open Source CMS Contao

1.3.0(1mo ago)00Apache-2.0PHPPHP ^8.3

Since Mar 16Pushed 1mo agoCompare

[ Source](https://github.com/netgroupgmbh/datatransformationlayer)[ Packagist](https://packagist.org/packages/netgroup/datatransformationlayer)[ RSS](/packages/netgroup-datatransformationlayer/feed)WikiDiscussions main Synced 1w ago

READMEChangelogDependencies (4)Versions (9)Used By (0)

Data Transformation Layer
=========================

[](#data-transformation-layer)

[![Lizenz](https://camo.githubusercontent.com/f922eb31b2ab41f1745abe00bf699bf86d0d22bfe03ba2a3a284600c54b6d6e9/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c697a656e7a2d4170616368652d2d322e302d626c75652e737667)](LICENSE)[![PHP](https://camo.githubusercontent.com/3ed0aba78d953e7a0393ff62845b98b4401a24d21135a2f872023ae25ce19fb3/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5048502d253545382e332d3737376262342e737667)](https://camo.githubusercontent.com/3ed0aba78d953e7a0393ff62845b98b4401a24d21135a2f872023ae25ce19fb3/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5048502d253545382e332d3737376262342e737667)[![Contao](https://camo.githubusercontent.com/497293bd39c8790543c88a917c7a2f55dcd0a1bef7526facf3087f9ff8842a8d/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f436f6e74616f2d253545352e332d6561356430622e737667)](https://camo.githubusercontent.com/497293bd39c8790543c88a917c7a2f55dcd0a1bef7526facf3087f9ff8842a8d/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f436f6e74616f2d253545352e332d6561356430622e737667)

Eine schlanke **Data Transformation Layer** für Contao-Bundles: Du definierst **Projections** (ausgabespezifische Feld-Transformationen) und wendest sie effizient auf große Datenmengen0 an – inklusive **Prefetching**, um N+1-Queries zu vermeiden. Neben der Transformation bestehender Felder können auch **neue berechnete Felder hinzugefügt** und **bestehende Felder entfernt** werden.

---

Autor
-----

[](#autor)

**NetGroup GmbH** - Patrick Froch

---

Support
-------

[](#support)

NetGroup Gesellschaft für Informationstechnologien in Deutschland mbH
Kaiserstraße 67
44135 Dortmund

Kontakt:
Telefon: +49 231 557509-0
Telefax: +49 231 557509-99
E-Mail:

Internet:

---

Inhalt
------

[](#inhalt)

- [Motivation](#motivation)
- [Features](#features)
- [Voraussetzungen](#voraussetzungen)
- [Installation](#installation)
- [Konfiguration (Symfony Services)](#konfiguration-symfony-services)
- [Quickstart](#quickstart)
- [Benutzung](#benutzung)
    - [1) Projection erstellen](#1-projection-erstellen)
    - [2) Converter erstellen](#2-converter-erstellen)
    - [3) Transformer anwenden](#3-transformer-anwenden)
    - [4) Prefetching (N+1 vermeiden)](#4-prefetching-n1-vermeiden)
    - [5) Felder hinzufügen (Additions)](#5-felder-hinzuf%C3%BCgen-additions)
    - [6) Felder entfernen (Removals)](#6-felder-entfernen-removals)
    - [7) Kombiniertes Beispiel](#7-kombiniertes-beispiel)
- [Fehler- &amp; Null-Policy](#fehler--null-policy)
- [Architektur (kurz)](#architektur-kurz)
- [Lexikon (Begriffe)](#lexikon-begriffe)
- [Testing &amp; Quality](#testing--quality)
- [Contributing](#contributing)
- [Lizenz](#lizenz)

---

Motivation
----------

[](#motivation)

In realen Contao-Projekten werden Daten häufig über **komplexe DBAL-Abfragen** geladen. Bevor die Daten ausgegeben werden können (Twig-Templates, Exporte, APIs), müssen Werte oft transformiert werden:

- Einfaches Formatieren (z. B. `tstamp -> "12.03.2026"`)
- Ersetzen technischer Werte durch Anzeige-Werte (z. B. `member_id -> "Jane Doe"`)
- Normalisieren/Ableiten von Feldern (z. B. Status-Labels, berechnete Summen)
- Anreichern mit Lookup-Daten aus anderen Tabellen
- Hinzufügen berechneter Felder (z. B. `total_price` aus `quantity * unit_price`)
- Entfernen technischer Hilfsspalten aus dem Output

Ohne klare Trennung der Verantwortlichkeiten wird diese Logik häufig über Controller, Templates und Repositories verteilt. Das führt schnell zu:

- **starker Kopplung** zwischen Query-Logik und Darstellung
- **Duplikation**, sobald mehrere Ausgaben unterschiedliche Formate benötigen (Liste vs. Export vs. API)
- **Performance-Problemen**, insbesondere N+1-Queries, wenn Fremdschlüssel pro Zeile einzeln aufgelöst werden
- fragile Konfiguration durch „stringly typed“ Arrays

**Lösung:**Dieses Paket liefert eine **Projection-basierte Transformation Layer**:

- Eine *Projection* ist eine PHP-Klasse, die definiert, *welche Felder* für eine Ausgabe transformiert, hinzugefügt oder entfernt werden.
- Ein *Converter* ist ein wiederverwendbarer Feld-Transformer (Formatting, Lookup, Mapping, Berechnung).
- Converter mit Prefetching können benötigte Lookup-Daten **einmal pro Dataset** laden und so N+1 verhindern.

Dadurch bleiben DBAL-Queries sauber, Ausgabelogik ist explizit und wiederverwendbar, und große Datenmengen können effizient verarbeitet werden.

---

Features
--------

[](#features)

- Projection-Definitionen als **PHP-Klassen** (keine „Array of strings"-Konfiguration)
- Converter-Referenzen via `::class` (refactor-freundlich, IDE-sicher)
- Optionales **Prefetching** gegen N+1 Lookups
- **Felder hinzufügen** (berechnete Werte, abgeleitete Felder)
- **Felder entfernen** (Hilfsspalten nach Berechnung entfernen)
- Direkte Verwendung von **DBAL-Result-Arrays** möglich (`fetchAllAssociative()`)
- Symfony-Integration über **Tagged Services** + `ServiceLocator`
- Geeignet für tausende Datensätze (Request-lokales Caching möglich)

---

Voraussetzungen
---------------

[](#voraussetzungen)

- PHP: `^8.3`
- Contao: `contao/core-bundle ^5.3`

---

Installation
------------

[](#installation)

Installation per Composer in deinem Contao-Projekt:

```
composer require netgroup/datatransformationlayer
```

Alternativ kannst du das Paket (`netgroup/datatransformationlayer`) über den **Contao Manager** installieren.

---

Konfiguration (Symfony Services)
--------------------------------

[](#konfiguration-symfony-services)

### `services.yaml` (Beispiel)

[](#servicesyaml-beispiel)

Lege die Datei `config/services.yaml` in deinem Bundle an (oder ergänze sie):

```
services:
  _defaults:
    autowire: true
    autoconfigure: false

  # --- Converter ---
  App\Conversion\Converter\:
    resource: '../../Classes/Conversion/Converter/*'
    tags: ['netgroup.datatransformation.converter']

  # --- Projections ---
  App\Conversion\Projection\:
    resource: '../../Classes/Conversion/Projection/*'
    tags: ['netgroup.datatransformation.projection']
```

*(Pfade müssen ggf. angepasst werden.)*

---

Quickstart
----------

[](#quickstart)

1. Projection-Klasse erstellen (z. B. `member_list`)
2. Converter-Klassen erstellen (z. B. Datum formatieren, Lookups)
3. Optional: Berechnete Felder hinzufügen (`addField`) oder Felder entfernen (`removeField`)
4. DBAL-Resultset mit `DatasetTransformer` transformieren

---

Benutzung
---------

[](#benutzung)

### 1) Projection erstellen

[](#1-projection-erstellen)

Eine Projection definiert **welche Felder** für eine bestimmte Ausgabe transformiert werden sollen.

Beispiel: `MemberListProjection` transformiert:

- `tstamp` (timestamp/string) → formatiertes Datum
- `id` → lesbarer Fullname (aus `firstname` + `lastname`)

```
