Similitudini tra gli hook di WordPress e le direttive GraphQL
Un'applicazione WordPress è altamente estensibile grazie ai plugin e all'uso degli hook (azioni e filtri) per modificare il comportamento di una porzione di codice (sia essa del core di WordPress, del tema o dei plugin). Gli hook sono semplici porzioni di codice che possono sovrascrivere un valore, oppure eseguire un'azione, ogni volta che vengono attivati.
In questo esempio, il filtro block_categories permette di modificare le categorie di blocchi abilitate nell'editor di WordPress:
\add_filter(
'block_categories',
function(array $categories): array
{
return [
...$categories,
[
'slug' => 'graphql-api-access-control',
'title' => __('Access Control for GraphQL', 'graphql-api'),
],
];
}
);Gli hook sono semplici, versatili e potenti; possono essere usati in modo improprio, ma se ben implementati rendono l'applicazione enormemente estensibile in modi che lo sviluppatore non aveva pianificato in anticipo.
Le direttive GraphQL come hook
Le direttive possono essere considerate l'equivalente per GraphQL di ciò che gli hook sono per WordPress.
Analogamente a un hook di WordPress, una direttiva è una funzione che modifica il valore di un campo, ampliando così qualche altra funzionalità. Come la sua controparte, è semplice, versatile e potente.
Ad esempio, supponiamo di recuperare un elenco di titoli di articoli con questa query:
query {
posts {
title
}
}Questi risultati sono in inglese. Come possiamo tradurli in italiano? Con una direttiva @strTranslate applicata al campo title, che prende il valore del campo come input, chiama l'API di Google Translate per tradurlo e restituisce questo output, come in questa query:
query {
posts {
title @strTranslate(from: "en", to: "it")
}
}Il caso d'uso per l'estensibilità è chiaro: dato un valore per il campo title, possiamo modificarlo in qualsiasi modo desiderato tramite una direttiva. In questo caso, la sua modifica è la traduzione in italiano tramite @strTranslate, ma potrebbe anche essere la conversione in maiuscolo/minuscolo tramite @strUpperCase e @strLowerCase, o qualsiasi altra cosa.