Spazi dei nomi nello schema per evitare conflitti
Gli sviluppatori che pubblicano plugin nella directory di WordPress non sanno in anticipo chi userà i loro plugin, né quale configurazione/ambiente avrà il sito, comprese le altre eventuali installazioni di plugin. Di conseguenza, il plugin deve essere preparato ai conflitti e tentare di prevenirli in anticipo.
Uno dei modi in cui i plugin WordPress evitano i conflitti è tramite gli spazi dei nomi PHP. I namespace sono ampiamente utilizzati all'interno della comunità PHP, seguendo la raccomandazione standard PHP PSR-4 per abilitare il caricamento automatico di Composer. I pacchetti PHP devono includere il nome del fornitore, come "vendor-name/package-name", e il namespace corrispondente è presente nel codice PHP:
<?php
namespace VendorName\PackageName\ClassName;Gli spazi dei nomi possono avere senso anche nel contesto di GraphQL, per evitare i seguenti potenziali conflitti che si verificano nello schema:
- Avere due tipi con lo stesso nome
- Avere due campi sullo stesso tipo con lo stesso nome
- Avere due direttive con lo stesso nome
Gli spazi dei nomi sono stati richiesti per la specifica GraphQL:
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.
Tuttavia, Lee Byron (uno dei creatori di GraphQL mentre lavorava in Facebook) ritiene che l'aggiunta degli spazi dei nomi alla specifica non sia giustificata. In questo commento, spiega come Facebook gestisce le migliaia di tipi nel suo schema GraphQL senza conflitti:
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. [...]
Ma il fatto che questa strategia funzioni per Facebook non significa che funzionerà in WordPress: poiché Facebook controlla tutti gli input del suo schema GraphQL, può permettersi di seguire una procedura per nominare le entità , assicurandosi che non sorga alcun conflitto. Ma un sito WordPress dipende fortemente da plugin di terze parti e non controlla il modo in cui questi plugin vengono prodotti.
Ad esempio, se un sito usa i plugin WooCommerce ed Easy Digital Downloads, ed entrambi hanno un tipo chiamato Product per lo schema GraphQL, ci sarà un conflitto. L'unica risorsa per il proprietario del sito è contattare una delle aziende e chiederle di modificare il proprio codice. Questa non è prevenzione, ma correzione, ed è poco affidabile.
Gli spazi dei nomi possono quindi dare ai proprietari di siti WordPress la tranquillità che il loro codice funzionerà sempre. Se due tipi hanno il nome Product, l'amministratore del sito può abilitare gli spazi dei nomi nello schema GraphQL, e questi tipi verranno automaticamente rinominati in WooCommerce_Product ed EDD_Product, evitando così il conflitto.
Come vantaggio aggiuntivo, gli spazi dei nomi rendono lo schema GraphQL più elegante: se WooCommerce volesse essere sicuro che non sorgerà mai alcun conflitto con il suo plugin, dovrebbe "namespacizzare" i suoi tipi nel nome del tipo stesso: WCProduct, WCDownload e WCPayment (oppure, per essere assolutamente certo che funzionerà sempre, potrebbe chiamarli WooCommerceProduct, WooCommerceDownload e WooCommercePayment). Grazie agli spazi dei nomi, questi tipi possono avere i nomi più naturali Product, Download e Payment.