Pflichtfelder, Nullable-Felder, Listen im Schema richtig modellieren
Pflichtfelder, Nullable-Felder, Listen im Schema richtig modellieren
~7 Min. Lesezeit Zuletzt aktualisiert am 9. August 2026
GraphQL-Typen sind standardmäßig nullable - jedes Feld darf null zurückgeben, sofern nicht explizit anders deklariert. Dieses Kapitel zeigt, wie !, Listen-Klammern [...] und ihre Kombinationen das Verhalten steuern - ein Thema, das beim Veranstaltungen-Schema in Kapitel 12 direkt zur Anwendung kommt.
Das Ausrufezeichen: Non-Null
String heißt "dieses Feld darf null sein", String! heißt "dieses Feld ist garantiert nicht null". Gibt ein Resolver für ein als ! deklariertes Feld dennoch null zurück, antwortet Magento nicht mit null im Feld, sondern mit einem GraphQL-Fehler - die Non-Null-Garantie wird zur Laufzeit durchgesetzt, nicht nur dokumentiert.
type Example {
id: ID! # garantiert vorhanden
title: String! # garantiert vorhanden
subtitle: String # darf fehlen (null)
}Non-Null bei Argumenten: Pflicht-Parameter
Dasselbe ! gilt auch für Argumente - dort bedeutet es, dass der Client diesen Wert zwingend mitschicken muss, sonst schlägt schon die Validierung der Anfrage fehl, bevor überhaupt ein Resolver aufgerufen wird:
type Query {
productBySku(sku: String!): Product # sku ist zwingend
}Listen und ihre vier Kombinationen
Eckige Klammern [...] markieren eine Liste. In Kombination mit ! ergeben sich vier unterschiedliche Bedeutungen, die häufig verwechselt werden:
[String]- die Liste selbst darfnullsein, und einzelne Einträge in der Liste dürfen ebenfallsnullsein.[String]!- die Liste selbst ist garantiert vorhanden (mindestens ein leeres Array), aber einzelne Einträge dürfennullsein.[String!]- die Liste selbst darfnullsein, aber wenn sie vorhanden ist, ist kein Eintragnull.[String!]!- sowohl die Liste als auch jeder einzelne Eintrag sind garantiert nichtnull- die strengste Variante.
// Resolver für ein Feld vom Typ [String!]!
// -> Rückgabe MUSS ein Array sein, und kein Element darf null sein:
return ['Montag', 'Dienstag', 'Mittwoch'];
// Für [String] wäre auch das hier gültig:
return null;
return ['Montag', null, 'Mittwoch'];Wann sich Non-Null wirklich lohnt
Non-Null wirkt auf den ersten Blick harmlos strenger und damit "sicherer" - in der Praxis ist das Gegenteil oft der Fall. Ein als ! deklariertes Feld, das der Resolver in einem Randfall doch nicht befüllen kann, reißt beim Rendern verschachtelter Queries den kompletten übergeordneten Ast der Antwort mit in den Fehler (GraphQL nennt das "Null-Bubbling"). Ein Feld, das plausibel auch einmal fehlen kann (z. B. eine optionale Kurzbeschreibung), sollte deshalb nullable bleiben.
Achtung: Null-Bubbling betrifft nicht nur das einzelne Feld: Ist title: String! innerhalb eines event: Event!-Feldes nicht befüllbar, wird nicht nur title zu null, sondern die komplette Elternebene event - und im schlimmsten Fall die ganze Antwort. Non-Null sollte deshalb nur für Felder verwendet werden, die fachlich wirklich niemals fehlen können (IDs, Pflichtwerte aus der Datenbank mit NOT NULL-Constraint).
Faustregel für das kommende Veranstaltungen-Schema
Block 4 hält sich an eine einfache Leitlinie: Spalten mit nullable="false" in db_schema.xml werden im GraphQL-Schema als ! deklariert (z. B. title: String!, identifier: String!), optionale Spalten (nullable="true", z. B. capacity) bleiben nullable. Diese 1:1-Abbildung zwischen DB-Schema und GraphQL-Schema ist kein Zwang der Spezifikation, aber eine verlässliche Faustregel, die Überraschungen vermeidet.
Tipp: Für Argumente mit einem sinnvollen Standardwert lohnt sich statt strikter !-Pflicht oft ein Default-Wert direkt im Schema - pageSize: Int = 20 statt pageSize: Int!. So bleibt das Argument optional, ohne dass der Resolver selbst einen Fallback-Wert nachbauen muss.
Mit Non-Null, Listen und ihrer Kombinatorik im Kopf ist Block 2 abgeschlossen. Block 3 zeigt, wie sich bestehende Core-Typen sauber erweitern lassen, ohne sie zu duplizieren.