如何使用 Laravel8 中的 Twig 扩展注入 php GraphQL 查询结果,在 Twig(Bridge) 模板中定义查询?
Posted
技术标签:
【中文标题】如何使用 Laravel8 中的 Twig 扩展注入 php GraphQL 查询结果,在 Twig(Bridge) 模板中定义查询?【英文标题】:how to inject php GraphQL query results , with queries defined in Twig(Bridge) templates, using Twig Extension in Laravel8? 【发布时间】:2021-06-14 08:08:16 【问题描述】:我已经设置了一个 laravel 8 站点,使用 php 7.4。
我更喜欢 Twig 前端模板而不是 Blade。我已经安装了 twigbridge 来启用 Twig 的使用。 模板效果很好。
我有一个通过 GraphQL 提供内容的后端应用。
我想在我的 Twig 模板中通过 GraphQL 查询访问/引用后端内容。
我已经在 Laravel 应用程序中安装了 composer-installed 'PHP GraphQL Client' (https://github.com/mghoneimy/php-graphql-client)。
它提供表单的php GraphQL查询访问:
$gql = (new Query('companies'))
->setSelectionSet(
[
'name',
'serialNumber'
]
);
为了将查询结果注入到我的 Laravel/Twig 模板中,我正在创建一个 TwigExtension
我正在从零散的在线帖子中拼凑扩展程序并且没有太多文档。 到目前为止,我已经有了(还没有功能/WIP)
edit app/Twig/GraphqlQuery.php
<?php
namespace App\Twig;
use Twig\Extension\AbstractExtension;
use Twig\TwigFilter;
use GraphQL\Client;
use GraphQL\Exception\QueryError;
use GraphQL\Query;
class GraphqlQuery extends AbstractExtension
protected $client;
protected $query;
public function __construct(
Client $client,
Query $query
)
$this->client = $client;
$this->query = $query;
public function getFunctions(): array
return [
new TwigFunction(
'gql_query',
[$this, 'gqlQuery']
),
];
public function gqlQuery($gql_data)
$gql = (new Query('twig'))
->setVariables(
[
new Variable('name', 'String', true),
new Variable('limit', 'Int', false, 5)
]
)
->setArguments(
[
'name' => '$name',
'first' => '$limit'
]
)
->setSelectionSet(
[
'name',
'serialNumber'
]
);
try
$results = $this->gqlClient->runQuery($gql);
catch (QueryError $exception)
print_r($exception->getErrorDetails());
exit;
$results = $this->gqlClient->runQuery($gql, true); // array structure
return $results;
我想获取数组数据
->setVariables(
[
new Variable('name', 'String', true),
new Variable('limit', 'Int', false, 5)
]
)
->setArguments(
[
'name' => '$name',
'first' => '$limit'
]
)
->setSelectionSet(
[
'name',
'serialNumber'
]
);
从我的 Twig 模板传入,理想地包裹在
#graphql
树枝标签。
第一步——重构 function gqlQuery()
以接受来自 Twig 模板的数组内容、正确编码等的正确方法是什么?
【问题讨论】:
模板编辑者需要在模板中添加内容。内容可通过 GraphQL 获得。 Twig 是模板环境。我需要 Twig 中的 GraphQL。和 Drupal 一样,git.drupalcode.org/project/graphql_twig 但对于 Laravel。 Drupal 解决方案是 Drpal 特有的解决方案;它被编写为 Drupal 模块。这当然适用于 Drupal。 TwigExtension 方法是我为我所在的 Laravel 环境尝试更通用/便携,理想情况下简单的东西。 【参考方案1】:如果您想在 twig 内部处理此用例,则没有简单的解决方案。您实际上可以将数组发送到TwigFunction
,例如
% set graph = glq_query(
'variables': [
[ 'name', 'String', true, ],
[ 'limit', 'Int', false, 5 ],
],
'arugments':
'name': '$name',
'first': '$limit',
,
'selectionSet': [
'name',
'serialNumber',
],
) %
但是您需要为每个可能的组合编写验证/检查,以控制 Graph QL 客户端
【讨论】:
是的,通用用例解决方案很快就会变得更胖。对于所有关于 GraphQL 的喋喋不休,你希望框架——至少是大框架——能够解决这个问题。但是哦,好吧,现在它是DIY。回复:你上面的sn-p,是的——那行得通。 Tho,这与简单地调用原始 php.ini 并没有太多不同。至少在语法方面,“编辑”会看到/使用。 是的,如果编写/编辑人员知道框架背后的PHP
语法,那么使用这样的数组设置系统对他们来说就不会那么不方便了。好吧,您可以从编写“基础”开始,并在需要额外内容时从那里扩展
随着我的深入研究,我倾向于删除抽象——并完全摆脱github.com/mghoneimy/php-graphql-client。显然,我有 php 和 php-curl 扩展。接收 JSON 对象、正确解码并通过curl_exec
直接传递到后端的 TwigExtension 应该可以解决问题。而且,编辑将能够将查询构造为“纯”JSON——与 GraphiQL UI 查询完全/不变。所以“测试它”然后“使用它”......以上是关于如何使用 Laravel8 中的 Twig 扩展注入 php GraphQL 查询结果,在 Twig(Bridge) 模板中定义查询?的主要内容,如果未能解决你的问题,请参考以下文章
子页面扩展 base.html.twig 但未呈现 base.html.twig 的内容