Similitudes entre los hooks de WordPress y las directivas de GraphQL
Una aplicación WordPress es altamente extensible mediante plugins y el uso de hooks (acciones y filtros) para modificar el comportamiento de algún fragmento de código (ya sea del núcleo de WordPress, del theme o de los plugins). Los hooks son sencillas piezas de código que pueden sobrescribir un valor, o ejecutar una acción, siempre que se disparen.
En este ejemplo, el filtro block_categories permite modificar las categorías de bloques habilitadas en el editor de WordPress:
\add_filter(
'block_categories',
function(array $categories): array
{
return [
...$categories,
[
'slug' => 'graphql-api-access-control',
'title' => __('Access Control for GraphQL', 'graphql-api'),
],
];
}
);Los hooks son sencillos, versátiles y potentes; pueden ser abusados, pero bien implementados, hacen que la aplicación sea enormemente extensible de formas que el desarrollador no planificó por adelantado.
Las directivas de GraphQL como hooks
Las directivas pueden considerarse el equivalente a los hooks que tiene WordPress, pero para GraphQL.
De forma similar a un hook de WordPress, una directiva es una función que modifica el valor de un campo, ampliando así alguna otra funcionalidad. Como su contraparte, es sencilla, versátil y potente.
Por ejemplo, supongamos que recuperamos una lista de títulos de entradas con esta consulta:
query {
posts {
title
}
}Estos resultados están en inglés. ¿Cómo podemos traducirlos al francés? Con una directiva @strTranslate aplicada al campo title, que toma el valor del campo como entrada, llama a la API de Google Translate para traducirlo, y devuelve esta salida, como en esta consulta:
query {
posts {
title @strTranslate(from: "en", to: "fr")
}
}El caso de uso para la extensibilidad es claro: dado un valor para el campo title, podemos modificarlo de cualquier forma deseada mediante una directiva. En este caso, su modificación es la traducción al francés mediante @strTranslate, pero también podría ser convertirlo a mayúsculas/minúsculas mediante @strUpperCase y @strLowerCase, o cualquier otra cosa.