Contentful ist ein sogenanntes Headless Content Management System (Headless CMS). Es ermöglicht Unternehmen, Inhalte (Content) zentral zu verwalten und flexibel über APIs an verschiedene Ausgabekanäle auszuliefern – z. B. Websites, Apps oder digitale Displays.
Traditionelle CMS (wie WordPress) verwalten Inhalte und präsentieren sie gleichzeitig auf einer fest verknüpften Website. Bei einem Headless CMS ist die „Präsentationsschicht“ (Frontend) vom „Content-Management“ (Backend) getrennt. Man hat also nur den „Kopf“ (Frontend) abgetrennt – daher der Begriff „headless“.
API-first: Inhalte werden über REST oder GraphQL APIs bereitgestellt.
Flexibles Content Modeling: Man definiert eigene Content-Typen (z. B. Blogartikel, Produkte, Testimonials) mit frei wählbaren Feldern.
Mehrsprachigkeit: Gute Unterstützung für mehrsprachige Inhalte.
Cloud-basiert: Keine eigene Server-Infrastruktur nötig.
Integration: Lässt sich gut mit Tools wie React, Vue, Next.js, Shopify, SAP, etc. kombinieren.
Unternehmen mit mehreren Ausgabekanälen (Website, App, Smartwatch, etc.)
Große Marken mit internationaler Präsenz
Entwicklerteams, die ein flexibles und skalierbares CMS suchen
Ein Headless CMS (Content Management System) ist ein Content-Management-System, bei dem das Backend (die Inhalte und ihre Verwaltung) vom Frontend (der Darstellung für die Nutzer) vollständig getrennt ist.
Backend und Frontend sind gekoppelt.
Die Inhalte werden im System erstellt und direkt als HTML über ein fest integriertes Theme angezeigt.
Vorteil: Alles aus einer Hand.
Nachteil: Eingeschränkte Flexibilität, schwer für Multi-Plattform-Ausgabe (z. B. App + Webseite + Smartwatch).
Nur Backend.
Inhalte werden über eine API (z. B. REST oder GraphQL) bereitgestellt.
Das Frontend (z. B. eine React-Webseite, native App, Digital Signage) holt sich die Inhalte dynamisch.
Vorteil: Sehr flexibel, geeignet für Multi-Channel-Ausspielung.
Nachteil: Frontend muss separat entwickelt werden (mehr Aufwand).
Webseiten mit modernen JavaScript-Frameworks (z. B. React, Next.js, Vue)
Mobile Apps, die denselben Content wie die Website zeigen sollen
Omnichannel-Strategien: Website, App, IoT-Geräte, etc.
Contentful
Strapi
Sanity
Directus
Prismic
Storyblok (Hybrid-Ansatz mit Visual Editor)
Storyblok ist ein benutzerfreundliches, headless Content-Management-System (CMS), das Entwicklern und Marketing-Teams hilft, Inhalte schnell und effizient zu erstellen, zu verwalten und zu veröffentlichen. Es bietet eine visuelle Bearbeitungsoberfläche, die es ermöglicht, Inhalte in Echtzeit zu gestalten, und ist flexibel mit verschiedenen Frameworks und Plattformen kompatibel. Durch seine API-first-Architektur können Inhalte auf jeder digitalen Plattform ausgespielt werden, was es ideal für moderne Web- und App-Entwicklung macht.
Shopware ist ein modulares E-Commerce-System aus Deutschland, mit dem man Online-Shops erstellen und verwalten kann. Es richtet sich sowohl an kleine Händler als auch an große Unternehmen und zeichnet sich durch seine Flexibilität, Skalierbarkeit und moderne Technologie aus.
Hier ein Überblick:
Hersteller: Shopware AG (gegründet 2000 in Deutschland)
Technologie: PHP, Symfony-Framework, API-first-Ansatz
Aktuelle Version: Shopware 6 (seit 2019)
Open Source: Ja, mit kostenpflichtigen Erweiterungen
Headless-Ready: Ja, unterstützt Headless-Commerce über APIs
Produktverwaltung: Varianten, Staffelpreise, Medien, SEO
Vertriebskanäle: Webshop, POS, Social Media, Marktplätze
Content Management: Integriertes CMS (Shopping Experiences)
Zahlung & Versand: Viele Schnittstellen, z. B. PayPal, Klarna
Mehrsprachigkeit & Multi-Currency
B2B- & B2C-Features
App-System & API für Erweiterungen
Startups (kostenfreie Community Edition)
KMU und Mittelstand
Enterprise-Kunden mit individuellen Anforderungen
Besonders beliebt im deutschsprachigen Raum
Made in Germany → DSGVO-konform
Hohe Individualisierbarkeit
Aktives Ökosystem & Community
Skalierbar für wachsende Anforderungen
Ein Entity Manager ist ein zentraler Bestandteil von ORM-Frameworks (Object-Relational Mapping), vor allem im Zusammenhang mit Java (JPA – Java Persistence API), aber auch in anderen Sprachen wie PHP (Doctrine ORM).
Hier ist eine verständliche Erklärung:
Ein Entity Manager ist eine Komponente, die sich um die Verwaltung von Datenbank-Entities (also Objekten/Datensätzen) kümmert. Er bildet die Schnittstelle zwischen der objektorientierten Welt des Codes und der relationalen Welt der Datenbank.
Persistieren (Speichern):
Finden/Laden:
Holt ein Objekt anhand seiner ID oder anderer Kriterien.
Beispiel: $entityManager->find(User::class, 1);
Aktualisieren:
Änderungen an einem Objekt werden verfolgt und in die Datenbank geschrieben (z. B. beim flush()
).
Entfernen/Löschen:
Löscht ein Objekt aus der Datenbank.
Beispiel: $entityManager->remove($user);
Transaktionen verwalten:
Beginnt, commitet oder rollt Transaktionen zurück.
Query-Handling:
Führt eigene Abfragen aus, oft mit DQL (Doctrine Query Language) oder JPQL.
Der Entity Manager verwaltet den „Zustand“ von Objekten:
managed (verfolgt Änderungen),
detached (nicht mehr verwaltet),
removed (zum Löschen markiert),
new (noch nicht gespeichert).
$user = new User();
$user->setName('Max Mustermann');
$entityManager->persist($user); // Zum Speichern vormerken
$entityManager->flush(); // Tatsächlich in DB schreiben
Der Entity Manager ist der zentrale Ansprechpartner, wenn es darum geht, mit Datenbankobjekten zu arbeiten – lesen, schreiben, ändern, löschen. Er abstrahiert die SQL-Ebene und macht die Datenbankarbeit objektorientiert steuerbar.
Ein Join Point ist ein Begriff aus der Aspect-Oriented Programming (AOP), also der aspektorientierten Programmierung.
Ein Join Point ist eine definierte Stelle im Ablauf eines Programms, an der zusätzlicher Code (ein sogenannter Aspekt) eingefügt werden kann.
Aufruf einer Methode
Ausführung einer Methode
Zugriff auf ein Attribut (lesen oder schreiben)
Werfen einer Ausnahme
In AOP wird Programmcode modularisiert, indem Querschnittsfunktionen (wie Logging, Sicherheit, Transaktionsmanagement) aus dem eigentlichen Anwendungscode ausgelagert werden. Diese Funktionen werden dann an bestimmten Punkten im Programmablauf (den Join Points) „eingeschnitten“.
Pointcut: Eine Ausdrucksweise, mit der beschrieben wird, welche Join Points betroffen sind (z. B. „alle Methoden mit dem Namen save*
“).
Advice: Der Code, der an einem Join Point ausgeführt wird (z. B. „logge diesen Methodenaufruf“).
Aspect: Eine Kombination aus Pointcut(s) und Advice(s) – also ein vollständiges Modul, das eine Querschnittsfunktion implementiert.
@Before("execution(* com.example.service.*.*(..))")
public void logBeforeMethod(JoinPoint joinPoint) {
System.out.println("Aufruf von: " + joinPoint.getSignature().getName());
}
→ Hier wird vor jedem Methodenaufruf in einem bestimmten Package ein Logging-Code ausgeführt – und joinPoint.getSignature()
liefert Details zum konkreten Join Point.
Aspect-Oriented Programming (AOP) ist ein Programmierparadigma, das sich darauf konzentriert, Querschnittsfunktionen (Cross-Cutting Concerns) modular zu kapseln. Es ergänzt objektorientierte oder funktionale Programmierung, indem es Code, der sich durch viele Klassen oder Module zieht, auslagert und separat behandelt.
Probleme wie Logging, Sicherheitsprüfungen, Fehlerbehandlung, Transaktionsmanagement oder Performance-Messungen sind typische Cross-Cutting Concerns. Diese wiederholen sich oft in vielen Klassen und Methoden – AOP ermöglicht es, solchen Code zentral zu schreiben und automatisch an den richtigen Stellen auszuführen.
Aspect: Ein Modul, das eine Querschnittsfunktion kapselt.
Advice: Der eigentliche Code, der ausgeführt wird (z. B. vor, nach oder anstatt einer Methode).
Join Point: Ein Punkt im Programmablauf, an dem ein Aspect eingreifen kann (z. B. Methodenaufruf).
Pointcut: Eine Definition, welche Join Points betroffen sind (z. B. "alle Methoden in Klasse X").
Weaving: Der Prozess, bei dem Aspect-Code mit dem eigentlichen Code „verwoben“ wird – zur Laufzeit, beim Kompilieren oder beim Laden.
@Aspect
public class LoggingAspect {
@Before("execution(* com.example.service.*.*(..))")
public void logBeforeMethod(JoinPoint joinPoint) {
System.out.println("Methode wird aufgerufen: " + joinPoint.getSignature().getName());
}
}
Dieser Code führt automatisch Logging aus, bevor jede Methode im com.example.service
-Paket ausgeführt wird.
Bessere Modularität
Weniger Code-Duplikate
Trennung von Fachlogik und Querschnittslogik
Kann die Lesbarkeit erschweren (man sieht nicht sofort, was alles beim Methodenaufruf passiert).
Debugging kann komplexer sein.
Oft framework-abhängig (z. B. Spring, AspectJ).
Assertions (auf Deutsch: Behauptungen oder Zusicherungen) sind Programmierkonstrukte, mit denen du Annahmen über den Zustand deines Programms überprüfst. Eine Assertion prüft, ob eine bestimmte Bedingung wahr ist – wenn nicht, wird typischerweise ein Fehler ausgelöst und das Programm abgebrochen.
x = 10
assert x > 0 # läuft problemlos
assert x < 5 # AssertionError, weil x nicht kleiner als 5 ist
Sie helfen beim Debuggen: Du überprüfst, ob bestimmte Voraussetzungen im Code erfüllt sind.
Sie dokumentieren implizite Annahmen: z. B. „An dieser Stelle muss die Liste mindestens ein Element haben.“
Sie dienen der Fehlersuche in der Entwicklungsphase – im Produktivcode werden sie oft deaktiviert.
Assertions sollen Programmfehler aufdecken, nicht Benutzereingaben oder äußere Einflüsse abfangen. Beispiel:
assert age > 0
→ falsch, wenn age
aus Benutzereingabe stammt.
Stattdessen: if age <= 0: raise ValueError("Alter muss positiv sein.")
Design by Contract (DbC) ist ein Konzept aus der Softwareentwicklung, das von Bertrand Meyer eingeführt wurde. Es beschreibt eine Methode zur Sicherstellung der Korrektheit und Zuverlässigkeit von Software, indem Verträge zwischen den verschiedenen Komponenten (z.B. Methoden, Klassen) definiert werden.
Bei DbC wird jede Software-Komponente wie eine Vertragspartei gesehen, die bestimmte Verpflichtungen und Garantien einhält:
Vorbedingungen (Preconditions)
Bedingungen, die erfüllt sein müssen, bevor eine Methode oder Funktion korrekt ausgeführt werden kann.
→ Verantwortung des Aufrufers.
Nachbedingungen (Postconditions)
Bedingungen, die nach der Ausführung garantiert werden.
→ Verantwortung der Methode/Funktion.
Invariant (Klasseninvariante)
Bedingungen, die während der gesamten Lebenszeit eines Objekts wahr bleiben müssen.
→ Verantwortung sowohl der Methode als auch des Aufrufers.
Klare Spezifikation der Verantwortlichkeiten.
Robustere und besser testbare Software.
Fehler werden frühzeitig erkannt (z.B. durch Verletzung des Vertrags).
class BankAccount {
private double balance;
// Invariante: balance >= 0
void withdraw(double amount) {
// Vorbedingung: amount > 0 && amount <= balance
if (amount <= 0 || amount > balance) throw new IllegalArgumentException();
balance -= amount;
// Nachbedingung: balance wurde um amount verringert
}
}
Klare Verträge führen zu weniger Missverständnissen.
Bessere Fehlersuche, da Verstöße gegen Verträge sofort auffallen.
Unterstützt die defensive Programmierung.
Erhöhter Aufwand in der Spezifikation.
Nicht von allen Programmiersprachen direkt unterstützt (z.B. Java, C++ über Assertions, Python mit Decorators; Eiffel unterstützt DbC nativ).
Ein Daemon (ausgesprochen wie „dä-mon“, nicht wie das englische „demon“) ist ein Hintergrundprozess, der auf einem Computersystem läuft – meist ohne direkte Benutzerinteraktion.
Startet automatisch beim Hochfahren des Systems.
Läuft dauerhaft im Hintergrund.
Erledigt Aufgaben, ohne dass der Benutzer direkt mit ihm arbeitet.
Hört auf Anforderungen von anderen Programmen oder Netzwerken.
cron
-Daemon: Führt zeitgesteuerte Aufgaben aus (z. B. tägliche Backups).
sshd
: Behandelt SSH-Verbindungen von außen.
httpd
oder nginx
: Webserver-Dienste.
cupsd
: Druckaufträge verwalten.
In Unix/Linux endet ein Daemon-Prozessname oft mit „d“ (z. B. httpd
, systemd
).
Ein Daemon wird oft beim Systemstart durch Init-Systeme wie systemd
oder init
gestartet.
Der Begriff stammt aus der griechischen Mythologie, wo „Daimon“ eine Art Geist oder übernatürliches Wesen war, das im Hintergrund wirkte – passend zur Funktion im Betriebssystem.