如何使用 Laravel8 中的 Twig 扩展注入 php GraphQL 查询结果,以及在 Twig(Bridge) 模板中定义的查询?

问题描述

我已经设置了一个 Laravel 8 站点,使用 PHP 7.4。

我更喜欢 Twig 前端模板而不是 Blade。我已经安装了 twigbridge 以启用 Twig 使用。 模板效果很好。

我有一个通过 GraphQL 提供内容的后端应用。

我想在我的 Twig 模板中通过 GraphQL 查询访问/引用后端内容

我已将“PHP GraphQL 客户端”(https://github.com/mghoneimy/php-graphql-client) 作曲家安装到 Laravel 应用中。

它提供了表单的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',5)
    ]
)
->setArguments(
    [
        'name' => '$name','first' => '$limit'
    ]
)
->setSelectionSet(
    [
        'name','serialNumber'
    ]
);

从我的 Twig 模板传入,理想情况下包裹在

{#graphql

树枝标签

第一步 -- 重构 function gqlQuery() 以接受来自 Twig 模板的正确编码等数组内容的正确方法是什么?

解决方法

如果您想在树枝内部处理此用例,则不会有针对此用例的简单解决方案。您实际上可以将数组发送到 TwigFunction,例如

{% set graph = glq_query({
    'variables': [
         [ 'name','String',true,],[ 'limit','Int',false,5 ],'arugments': {
        'name': '$name','first': '$limit',},'selectionSet': [
        'name','serialNumber',}) %}

但是,您需要为可以创建以控制 Graph QL 客户端的每个可能组合编写验证/检查

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...