Espacios de nombres en el esquema para evitar conflictos
Los desarrolladores que publican plugins en el directorio de WordPress no saben de antemano quién utilizará sus plugins, ni qué configuración/entorno tendrá el sitio, incluyendo qué otros plugins pueden estar instalados. Como consecuencia, el plugin debe estar preparado para los conflictos, e intentar prevenirlos de antemano.
Una de las formas que tienen los plugins de WordPress de evitar conflictos es mediante los espacios de nombres de PHP. Los namespaces se utilizan ampliamente en la comunidad PHP, siguiendo la PHP Standard Recommendation PSR-4 para habilitar la autocarga de Composer. Los paquetes de PHP deben incluir el nombre del vendor, como "vendor-name/package-name", y el namespace correspondiente está presente en el código PHP:
<?php
namespace VendorName\PackageName\ClassName;Los espacios de nombres también pueden tener sentido dentro del contexto de GraphQL, para evitar los siguientes posibles conflictos que se producen en el esquema:
- Tener dos tipos con el mismo nombre
- Tener dos campos en el mismo tipo con el mismo nombre
- Tener dos directivas con el mismo nombre
Los espacios de nombres han sido solicitados para la especificación de 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.
Sin embargo, Lee Byron (uno de los creadores de GraphQL mientras trabajaba en Facebook) considera que añadir espacios de nombres a la especificación no está justificado. En este comentario, explica cómo Facebook gestiona los miles de tipos de su esquema GraphQL sin conflictos:
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. [...]
Pero el hecho de que esta estrategia funcione para Facebook, no significa que vaya a funcionar en WordPress: como Facebook controla todas las entradas de su esquema GraphQL, puede permitirse seguir un procedimiento para nombrar las entidades, asegurándose de que no surge ningún conflicto. Pero un sitio WordPress depende en gran medida de plugins de terceros, y no controla cómo se producen estos plugins.
Por ejemplo, si un sitio utiliza los plugins WooCommerce y Easy Digital Downloads, y ambos tienen un tipo llamado Product para el esquema GraphQL, habrá un conflicto. El único recurso para el propietario del sitio es ponerse en contacto con una de las empresas y pedirles que modifiquen su código. Esto no es prevención, sino corrección, y no es fiable.
Los espacios de nombres pueden entonces dar a los propietarios de sitios WordPress la tranquilidad de que su código siempre funcionará. Si dos tipos tienen el nombre Product, el administrador del sitio puede habilitar los espacios de nombres en el esquema GraphQL, y estos tipos serán renombrados automáticamente a WooCommerce_Product y EDD_Product, evitando el conflicto.
Como ventaja añadida, los espacios de nombres hacen que el esquema GraphQL sea más elegante: si WooCommerce quisiera asegurarse de que nunca surja ningún conflicto con su plugin, entonces debe "namespacear" sus tipos en el propio nombre del tipo: WCProduct, WCDownload y WCPayment (o, para tener la absoluta certeza de que siempre funcionará, podría llamarlos WooCommerceProduct, WooCommerceDownload y WooCommercePayment). Gracias a los espacios de nombres, estos tipos pueden tener los nombres más naturales Product, Download y Payment.