如何使用 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) 模板中定义查询?的主要内容,如果未能解决你的问题,请参考以下文章

Twig扩展禁用自动转义

如何使用自定义函数 Twig-symfony

子页面扩展 base.html.twig 但未呈现 base.html.twig 的内容

如何“打破” Twig 中的循环?

通过核心扩展更改 number_format 过滤器的默认值

如何根据项目中的实际twig文件创建数据列表