Namespacing des Schemas zur Vermeidung von Konflikten
Entwickler, die Plugins im WordPress-Verzeichnis veröffentlichen, wissen nicht im Voraus, wer ihre Plugins verwenden wird oder welche Konfiguration/Umgebung die Website haben wird, einschließlich welche anderen Plugins installiert sein könnten. Infolgedessen muss das Plugin auf Konflikte vorbereitet sein und versuchen, diese im Vorfeld zu verhindern.
Eine der Möglichkeiten, wie WordPress-Plugins Konflikte vermeiden, ist PHP-Namespacing. Namespaces werden in der PHP-Community häufig verwendet, wobei der PHP-Standard PSR-4 befolgt wird, um das Composer-Autoloading zu ermöglichen. PHP-Pakete müssen den Namen des Anbieters enthalten, als "vendor-name/package-name", und der entsprechende Namespace ist im PHP-Code vorhanden:
<?php
namespace VendorName\PackageName\ClassName;Namespacing kann auch im Kontext von GraphQL sinnvoll sein, um die folgenden potenziellen Konflikte im Schema zu vermeiden:
- Zwei Typen mit demselben Namen zu haben
- Zwei Felder desselben Typs mit demselben Namen zu haben
- Zwei Direktiven mit demselben Namen zu haben
Namespacing wurde für die GraphQL-Spezifikation angefragt:
At the moment all GraphQL types share one global namespace. This is also true for all of the fields in mutation/subscription type. It can be a concern for bigger projects which may contain several loosely-coupled parts in a GraphQL schema.
Lee Byron (einer der Schöpfer von GraphQL, während er bei Facebook arbeitete) ist jedoch der Meinung, dass das Hinzufügen von Namespacing zur Spezifikation nicht gerechtfertigt ist. In diesem Kommentar erklärt er, wie Facebook die Tausenden von Typen in seinem GraphQL-Schema konfliktfrei verwaltet:
We avoid naming collisions in two ways:
- integration tests.
We don't allow any commit to merge into our repository that would result in a broken GraphQL schema. [...]
- Common naming patterns.
We have common patterns for naming things which naturally avoid collision problems. [...]
Aber die Tatsache, dass diese Strategie für Facebook funktioniert, bedeutet nicht, dass sie in WordPress funktionieren wird: Da Facebook alle Eingaben in sein GraphQL-Schema kontrolliert, kann es sich leisten, ein Verfahren zur Benennung der Entitäten zu befolgen und sicherzustellen, dass kein Konflikt entsteht. Eine WordPress-Website hingegen ist stark von Drittanbieter-Plugins abhängig und hat keine Kontrolle darüber, wie diese Plugins entwickelt werden.
Wenn zum Beispiel eine Website die Plugins WooCommerce und Easy Digital Downloads verwendet und beide einen Typ namens Product für das GraphQL-Schema haben, entsteht ein Konflikt. Die einzige Möglichkeit für den Website-Eigentümer besteht darin, eines der Unternehmen zu kontaktieren und darum zu bitten, den Code zu ändern. Das ist keine Prävention, sondern Korrektur, und sie ist unzuverlässig.
Namespacing kann WordPress-Website-Eigentümern daher die Gewissheit geben, dass ihr Code immer funktionieren wird. Wenn zwei Typen den Namen Product haben, kann der Site-Administrator Namespacing im GraphQL-Schema aktivieren, und diese Typen werden automatisch in WooCommerce_Product und EDD_Product umbenannt, wodurch der Konflikt vermieden wird.
Als zusätzlichen Vorteil macht Namespacing das GraphQL-Schema eleganter: Wenn WooCommerce sicherstellen wollte, dass mit seinem Plugin nie ein Konflikt entstehen wird, müsste es seine Typen im Typnamen selbst „namespacen": WCProduct, WCDownload und WCPayment (oder, um absolut sicher zu sein, dass es immer funktioniert, könnten sie WooCommerceProduct, WooCommerceDownload und WooCommercePayment heißen). Dank Namespacing können diese Typen die natürlicheren Namen Product, Download und Payment tragen.