Conceitos, Ideias, Estratégias
Conceitos, Ideias, EstratégiasSimilaridades entre os hooks do WordPress e as diretivas GraphQL

Similaridades entre os hooks do WordPress e as diretivas GraphQL

Uma aplicação WordPress é altamente extensível por meio de plugins e do uso de hooks (ações e filtros) para modificar o comportamento de uma parte do código (seja do core do WordPress, do tema ou de plugins). Hooks são trechos simples de código que podem sobrescrever um valor ou executar uma ação sempre que ativados.

Neste exemplo, o filtro block_categories permite modificar as categorias de blocos habilitadas no editor do WordPress:

\add_filter(
  'block_categories',
  function(array $categories): array
  {
    return [
      ...$categories,
      [
        'slug' => 'graphql-api-access-control',
        'title' => __('Access Control for GraphQL', 'graphql-api'),
      ],
    ];
  }
);

Hooks são simples, versáteis e poderosos; podem ser usados de forma inadequada, mas quando bem implementados tornam a aplicação extremamente extensível de maneiras que o desenvolvedor não havia planejado de antemão.

As diretivas GraphQL como hooks

As diretivas podem ser consideradas o equivalente no GraphQL do que os hooks são para o WordPress.

De forma similar a um hook do WordPress, uma diretiva é uma função que modifica o valor de um campo, ampliando assim alguma outra funcionalidade. Assim como sua contraparte, ela é simples, versátil e poderosa.

Por exemplo, suponha que recuperamos uma lista de títulos de posts com esta query:

query {
  posts {
    title
  }
}

Esses resultados estão em inglês. Como podemos traduzi-los para o português? Com uma diretiva @strTranslate aplicada ao campo title, que recebe o valor do campo como entrada, chama a API do Google Translate para traduzi-lo e retorna essa saída, como nesta query:

query {
  posts {
    title @strTranslate(from: "en", to: "pt")
  }
}

O caso de uso para extensibilidade é claro: dado um valor para o campo title, podemos modificá-lo da forma desejada por meio de uma diretiva. Neste caso, a modificação é a tradução para o português via @strTranslate, mas também poderia ser a conversão para maiúsculas/minúsculas por meio de @strUpperCase e @strLowerCase, ou qualquer outra coisa.