在 Lighthouse 中,resolver 所对应的类方法 __invoke 未执行的排查分析

1、GraphQL 架构定义如下

"获取主题页面的配置"
templateDetails(basename: String!): OnlineStoreThemeTemplateDetails @field(resolver: "Modules\\OnlineStoreThemeGraphQL\\Resolver\\OnlineStoreTheme\\TemplateDetailsResolver")

type OnlineStoreThemeTemplateDetails {
    sectionsData: [OnlineStoreThemeSection]
    sectionSchemas: [OnlineStoreThemeSectionSchema]
}

2、在类 TemplateDetailsResolver 中方法 __invoke 中打印输出 1,未输出。如图1

图1

public function __invoke($rootValue, array $args, GraphQLContext $context, ResolveInfo $resolveInfo)
{
 echo 1;
 exit;
}
        "templateDetails": {
          "sectionsData": null,
          "sectionSchemas": null
        },

3、GraphQL 架构定义还原如下,则对应的类方法 __invoke 能够执行到。如图2

图2

"获取主题页面的配置"
templateDetails(basename: String!): [OnlineStoreThemeSection] @field(resolver: "Modules\\OnlineStoreThemeGraphQL\\Resolver\\OnlineStoreTheme\\TemplateDetailsResolver")

type OnlineStoreThemeTemplateDetails {
    sectionsData: [OnlineStoreThemeSection]
    sectionSchemas: [OnlineStoreThemeSectionSchema]
}

4、决定拆分 GraphQL 架构定义,则对应的类方法 __invoke 能够执行到。

"获取主题页面的配置"
templateDetails(basename: String!): OnlineStoreThemeTemplateDetails

type OnlineStoreThemeTemplateDetails {
    sectionsData: [OnlineStoreThemeSection] @field(resolver: "Modules\\OnlineStoreThemeGraphQL\\Resolver\\OnlineStoreTheme\\TemplateDetailsResolver")
    sectionSchemas: [OnlineStoreThemeSectionSchema]
}

5、GraphQL 架构定义调整解析类,则对应的类方法 __invoke 能够执行到。确认问题根源在于解析类本身。

"获取主题页面的配置"
templateDetails(basename: String!): OnlineStoreThemeTemplateDetails @field(resolver: "Modules\\OnlineStoreThemeGraphQL\\Resolver\\SectionPresetsByBaseNameResolver")

type OnlineStoreThemeTemplateDetails {
    sectionsData: [OnlineStoreThemeSection]
    sectionSchemas: [OnlineStoreThemeSectionSchema]
}

6、还原至步骤 1 ,决定沿用此架构,在类的构造方法中调试程序,查看调用栈。也确认了 __construct 可以执行,但是 __invoke 未执行到。比较类(Modules\\OnlineStoreThemeGraphQL\\Resolver\\SectionPresetsByBaseNameResolver) 与 类(Modules\\OnlineStoreThemeGraphQL\\Resolver\\OnlineStoreTheme\\TemplateDetailsResolver)

<?php

namespace Modules\OnlineStoreThemeGraphQL\Resolver;

use Modules\OnlineStoreThemeGraphQL\Resolver\Id;
use Modules\ThemeSetting\Schema\RawSchemaLoaderInterface;
use Modules\ThemeSetting\Schema\Builder\SectionBuilder;
use Modules\ThemeSetting\Schema\Dto\Section;
use Nuwave\Lighthouse\Support\Contracts\GraphQLContext;
use GraphQL\Type\Definition\ResolveInfo;
use Modules\OnlineStoreThemeGraphQL\Resolver\OnlineStoreTheme\ResolveSectionSchema;
use Modules\ThemeSetting\Schema\Dto\Section\Block;
use Modules\ThemeSetting\Schema\Dto\Section\Setting\BlockSetting;
use Modules\ThemeSetting\Schema\Dto\Section\Setting\SectionDefault;
use Modules\ThemeSetting\Schema\Dto\Section\Setting\SectionSetting;
use Wwwision\RelayPagination\Loader\ArrayLoader;
use Wwwision\RelayPagination\Loader\Loader;

class SectionPresetsByBaseNameResolver
{
    use ResolveSectionSchema;

    private SectionBuilder $sectionBuilder;

    private RawSchemaLoaderInterface $rawSectionSchemaLoader;

    public function __construct(RawSchemaLoaderInterface $rawSectionSchemaLoader, SectionBuilder $sectionBuilder)
    {
        $this->sectionBuilder = $sectionBuilder;
        $this->rawSectionSchemaLoader = $rawSectionSchemaLoader;
    }

    public function __invoke($rootValue, array $args, GraphQLContext $context, ResolveInfo $resolveInfo):Loader
    {
        $basename = $args['basename'];

        $query = $args['query']??null;

        $themeId = $rootValue['sectionPresetsByBasename']['theme_id'];

        $rawSchemas = $this->rawSectionSchemaLoader->loadAllSectionSchemas();

        $excludedSections = array_merge([Block::APP_BLOCK_SECTION], config('theme_setting.schema.allowed_sections'));

        $sectionSettings = collect($rawSchemas)->filter(function($rawSchema, $type) use($excludedSections){
                // Skip app wrapper 组件
            return !in_array($type, $excludedSections);
        })->map(function($rawSchema, $type) use($themeId){
            $id = Id::createSectionSchemaId($themeId, $type);
            $section = new Section();
            $this->sectionBuilder->build($rawSchema, $section);

           return [
                'categoryName' => 'None',
                'id' => $id,
                'name' => $section->getName(),
                'section' => $this->resolveSectionSetting($id, $id, $themeId, $this->preparePreset($section, $type), $section)
            ];
        });

        $loader = new ArrayLoader($sectionSettings->toArray());

        return $loader;
    }

    private function preparePreset(Section $section, string $type): SectionSetting
    {
        $defaultSectionSetting =  $section->hasPresets() ? head(array_values($section->getPresets())): $section->getDefault();

        $presetSettings = [];
        foreach($section->getIdentifiedSettings() as $id => $setting) {
            $presetSettings[$id] = $setting->getDefault();
        }
        $presetSettings = array_merge($presetSettings, $defaultSectionSetting? $defaultSectionSetting->getSettings(): []);

        $sectionSetting = new SectionSetting();
        $sectionSetting->setSettings($presetSettings );
        $sectionSetting->setBlocks($this->prepareBlockSettings($section, $defaultSectionSetting));
        $sectionSetting->setType($type);

        return $sectionSetting;
    }

    private function prepareBlockSettings(Section $section, SectionDefault $defaultSectionSetting = null)
    {
        $sectionDefaultBlockSettings = [];
        foreach($section->getBlocks() as $block) {
            $settings = [];
            foreach($block->getSettings() as $setting) {
                $settings[$setting->getId()] = $setting->getDefault();
            }

            $blockSetting = new BlockSetting();
            $blockSetting->setType($block->getType());
            $blockSetting->setSettings($settings);

            $sectionDefaultBlockSettings[$block->getType()] = $blockSetting;
        }

        // Merge block settings
        if ($defaultSectionSetting) {
            $blockSettings =  $defaultSectionSetting->getBlocks();
            foreach($blockSettings as $blockSetting) {
                /**
                 * @var \Modules\ThemeSetting\Schema\Dto\Section\Setting\BlockSetting
                 */                $defaultBlockSetting = $sectionDefaultBlockSettings[$blockSetting->getType()];
                $blockSetting->setSettings(array_merge($defaultBlockSetting->getSettings(), $blockSetting->getSettings()));
            }

            return $blockSettings;
        }


        return $sectionDefaultBlockSettings;
    }
}

<?php

namespace Modules\OnlineStoreThemeGraphQL\Resolver\OnlineStoreTheme;

use Nuwave\Lighthouse\Support\Contracts\GraphQLContext;
use GraphQL\Type\Definition\ResolveInfo;
use Modules\OnlineStoreThemeGraphQL\GraphQl\Exception\GraphQlInputException;
use Modules\OnlineStoreThemeGraphQL\Resolver\Id;
use Modules\OnlineStoreThemeGraphQL\ThemeSetting\RawSchemaLoaderAdapter;
use Modules\Theme\ThemeContext;
use Modules\ThemeSetting\Schema\Dto\Template;
use Modules\ThemeSetting\Schema\Builder\TemplateBuilder;

class TemplateDetailsResolver
{
    use ResolveSectionSchema;

    private ThemeContext $themeContext;

    private TemplateBuilder $templateBuilder;

    public function __construct(ThemeContext $themeContext, TemplateBuilder $templateBuilder)
    {
        $this->themeContext = $themeContext;
        $this->templateBuilder = $templateBuilder;
    }

    public function __invoke($rootValue, array $args, GraphQLContext $context, ResolveInfo $resolveInfo)
    {
        $themeId = $rootValue['templateSettingsData']['theme_id'];
        $basename = $args['basename'];
        $rawSchemaLoader = $this->themeContext
            ->getThemeViewFactory()
            ->createRawSchemaLoader();

        $rawSchemaLoaderAdapter = new RawSchemaLoaderAdapter($rawSchemaLoader);
        $sessionId = $rootValue['session_id']?? null;
        $rawSchemaLoaderAdapter->setSessionId($sessionId);

        try {
            $rawSchema = $rawSchemaLoaderAdapter->loadTemplateSchema($basename);

            $template = new Template();

            $this->templateBuilder->build($rawSchema, $template);
        } catch(\Exception $e) {
            throw new GraphQlInputException($e->getMessage());
        }

        $id = new Id([$themeId, $basename]);

        return [];

        foreach($template as $sectionId => $section) {
            list($schema, $setting) =  $section;

            $globalSectionId = $id->with($sectionId);

            yield  $this->resolveSectionSetting($globalSectionId, $sectionId, $themeId, $setting, $schema);
        }
    }
}

{
  "message": "Call to undefined function Modules\\OnlineStoreThemeGraphQL\\Resolver\\OnlineStoreTheme\\checkhere()",
  "exception": "Symfony\\Component\\Debug\\Exception\\FatalThrowableError",
  "file": "E:\\wwwroot\\object\\Modules\\OnlineStoreThemeGraphQL\\Resolver\\OnlineStoreTheme\\TemplateDetailsResolver.php",
  "line": 24,
  "trace": [
    {
      "function": "__construct",
      "class": "Modules\\OnlineStoreThemeGraphQL\\Resolver\\OnlineStoreTheme\\TemplateDetailsResolver",
      "type": "->"
    },
    {
      "file": "E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Container\\Container.php",
      "line": 843,
      "function": "newInstanceArgs",
      "class": "ReflectionClass",
      "type": "->"
    },
    {
      "file": "E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Container\\Container.php",
      "line": 681,
      "function": "build",
      "class": "Illuminate\\Container\\Container",
      "type": "->"
    },
    {
      "file": "E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Foundation\\Application.php",
      "line": 785,
      "function": "resolve",
      "class": "Illuminate\\Container\\Container",
      "type": "->"
    },
    {
      "file": "E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Container\\Container.php",
      "line": 629,
      "function": "resolve",
      "class": "Illuminate\\Foundation\\Application",
      "type": "->"
    },
    {
      "file": "E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Foundation\\Application.php",
      "line": 770,
      "function": "make",
      "class": "Illuminate\\Container\\Container",
      "type": "->"
    },
    {
      "file": "E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Foundation\\helpers.php",
      "line": 120,
      "function": "make",
      "class": "Illuminate\\Foundation\\Application",
      "type": "->"
    },
    {
      "file": "E:\\wwwroot\\object\\vendor\\nuwave\\lighthouse\\src\\Support\\Utils.php",
      "line": 58,
      "function": "app"
    },
    {
      "file": "E:\\wwwroot\\object\\vendor\\nuwave\\lighthouse\\src\\Schema\\Directives\\FieldDirective.php",
      "line": 45,
      "function": "constructResolver",
      "class": "Nuwave\\Lighthouse\\Support\\Utils",
      "type": "::"
    },
    {
      "file": "E:\\wwwroot\\object\\vendor\\nuwave\\lighthouse\\src\\Schema\\Factories\\FieldFactory.php",
      "line": 69,
      "function": "resolveField",
      "class": "Nuwave\\Lighthouse\\Schema\\Directives\\FieldDirective",
      "type": "->"
    },
    {
      "file": "E:\\wwwroot\\object\\vendor\\nuwave\\lighthouse\\src\\Schema\\TypeRegistry.php",
      "line": 414,
      "function": "handle",
      "class": "Nuwave\\Lighthouse\\Schema\\Factories\\FieldFactory",
      "type": "->"
    },
    {
      "file": "E:\\wwwroot\\object\\vendor\\webonyx\\graphql-php\\src\\Type\\Definition\\UnresolvedFieldDefinition.php",
      "line": 39,
      "function": "Nuwave\\Lighthouse\\Schema\\{closure}",
      "class": "Nuwave\\Lighthouse\\Schema\\TypeRegistry",
      "type": "::"
    },
    {
      "file": "E:\\wwwroot\\object\\vendor\\webonyx\\graphql-php\\src\\Type\\Definition\\TypeWithFields.php",
      "line": 45,
      "function": "resolve",
      "class": "GraphQL\\Type\\Definition\\UnresolvedFieldDefinition",
      "type": "->"
    },
    {
      "file": "E:\\wwwroot\\object\\vendor\\webonyx\\graphql-php\\src\\Type\\Definition\\TypeWithFields.php",
      "line": 33,
      "function": "findField",
      "class": "GraphQL\\Type\\Definition\\TypeWithFields",
      "type": "->"
    },
    {
      "file": "E:\\wwwroot\\object\\vendor\\webonyx\\graphql-php\\src\\Validator\\Rules\\OverlappingFieldsCanBeMerged.php",
      "line": 256,
      "function": "getField",
      "class": "GraphQL\\Type\\Definition\\TypeWithFields",
      "type": "->"
    },
    {
      "file": "E:\\wwwroot\\object\\vendor\\webonyx\\graphql-php\\src\\Validator\\Rules\\OverlappingFieldsCanBeMerged.php",
      "line": 165,
      "function": "internalCollectFieldsAndFragmentNames",
      "class": "GraphQL\\Validator\\Rules\\OverlappingFieldsCanBeMerged",
      "type": "->"
    },
    {
      "file": "E:\\wwwroot\\object\\vendor\\webonyx\\graphql-php\\src\\Validator\\Rules\\OverlappingFieldsCanBeMerged.php",
      "line": 96,
      "function": "getFieldsAndFragmentNames",
      "class": "GraphQL\\Validator\\Rules\\OverlappingFieldsCanBeMerged",
      "type": "->"
    },
    {
      "file": "E:\\wwwroot\\object\\vendor\\webonyx\\graphql-php\\src\\Validator\\Rules\\OverlappingFieldsCanBeMerged.php",
      "line": 64,
      "function": "findConflictsWithinSelectionSet",
      "class": "GraphQL\\Validator\\Rules\\OverlappingFieldsCanBeMerged",
      "type": "->"
    },
    {
      "file": "E:\\wwwroot\\object\\vendor\\webonyx\\graphql-php\\src\\Language\\Visitor.php",
      "line": 414,
      "function": "GraphQL\\Validator\\Rules\\{closure}",
      "class": "GraphQL\\Validator\\Rules\\OverlappingFieldsCanBeMerged",
      "type": "->"
    },
    {
      "file": "E:\\wwwroot\\object\\vendor\\webonyx\\graphql-php\\src\\Language\\Visitor.php",
      "line": 470,
      "function": "GraphQL\\Language\\{closure}",
      "class": "GraphQL\\Language\\Visitor",
      "type": "::"
    },
    {
      "file": "E:\\wwwroot\\object\\vendor\\webonyx\\graphql-php\\src\\Language\\Visitor.php",
      "line": 277,
      "function": "GraphQL\\Language\\{closure}",
      "class": "GraphQL\\Language\\Visitor",
      "type": "::"
    },
    {
      "file": "E:\\wwwroot\\object\\vendor\\webonyx\\graphql-php\\src\\Validator\\DocumentValidator.php",
      "line": 224,
      "function": "visit",
      "class": "GraphQL\\Language\\Visitor",
      "type": "::"
    },
    {
      "file": "E:\\wwwroot\\object\\vendor\\webonyx\\graphql-php\\src\\Validator\\DocumentValidator.php",
      "line": 116,
      "function": "visitUsingRules",
      "class": "GraphQL\\Validator\\DocumentValidator",
      "type": "::"
    },
    {
      "file": "E:\\wwwroot\\object\\vendor\\webonyx\\graphql-php\\src\\GraphQL.php",
      "line": 153,
      "function": "validate",
      "class": "GraphQL\\Validator\\DocumentValidator",
      "type": "::"
    },
    {
      "file": "E:\\wwwroot\\object\\vendor\\webonyx\\graphql-php\\src\\GraphQL.php",
      "line": 94,
      "function": "promiseToExecute",
      "class": "GraphQL\\GraphQL",
      "type": "::"
    },
    {
      "file": "E:\\wwwroot\\object\\vendor\\nuwave\\lighthouse\\src\\GraphQL.php",
      "line": 268,
      "function": "executeQuery",
      "class": "GraphQL\\GraphQL",
      "type": "::"
    },
    {
      "file": "E:\\wwwroot\\object\\vendor\\nuwave\\lighthouse\\src\\GraphQL.php",
      "line": 203,
      "function": "executeParsedQuery",
      "class": "Nuwave\\Lighthouse\\GraphQL",
      "type": "->"
    },
    {
      "file": "E:\\wwwroot\\object\\vendor\\nuwave\\lighthouse\\src\\GraphQL.php",
      "line": 162,
      "function": "parseAndExecuteQuery",
      "class": "Nuwave\\Lighthouse\\GraphQL",
      "type": "->"
    },
    {
      "file": "E:\\wwwroot\\object\\vendor\\nuwave\\lighthouse\\src\\GraphQL.php",
      "line": 121,
      "function": "executeOperation",
      "class": "Nuwave\\Lighthouse\\GraphQL",
      "type": "->"
    },
    {
      "file": "E:\\wwwroot\\object\\vendor\\nuwave\\lighthouse\\src\\Support\\Utils.php",
      "line": 99,
      "function": "Nuwave\\Lighthouse\\{closure}",
      "class": "Nuwave\\Lighthouse\\GraphQL",
      "type": "->"
    },
    {
      "file": "E:\\wwwroot\\object\\vendor\\nuwave\\lighthouse\\src\\GraphQL.php",
      "line": 120,
      "function": "mapEach",
      "class": "Nuwave\\Lighthouse\\Support\\Utils",
      "type": "::"
    },
    {
      "file": "E:\\wwwroot\\object\\vendor\\nuwave\\lighthouse\\src\\Support\\Http\\Controllers\\GraphQLController.php",
      "line": 32,
      "function": "executeOperationOrOperations",
      "class": "Nuwave\\Lighthouse\\GraphQL",
      "type": "->"
    },
    {
      "file": "E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\ControllerDispatcher.php",
      "line": 48,
      "function": "__invoke",
      "class": "Nuwave\\Lighthouse\\Support\\Http\\Controllers\\GraphQLController",
      "type": "->"
    },
    {
      "file": "E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Route.php",
      "line": 219,
      "function": "dispatch",
      "class": "Illuminate\\Routing\\ControllerDispatcher",
      "type": "->"
    },
    {
      "file": "E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Route.php",
      "line": 176,
      "function": "runController",
      "class": "Illuminate\\Routing\\Route",
      "type": "->"
    },
    {
      "file": "E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Router.php",
      "line": 681,
      "function": "run",
      "class": "Illuminate\\Routing\\Route",
      "type": "->"
    },
    {
      "file": "E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php",
      "line": 130,
      "function": "Illuminate\\Routing\\{closure}",
      "class": "Illuminate\\Routing\\Router",
      "type": "->"
    },
    {
      "file": "E:\\wwwroot\\object\\vendor\\nuwave\\lighthouse\\src\\Support\\Http\\Middleware\\AttemptAuthentication.php",
      "line": 34,
      "function": "Illuminate\\Pipeline\\{closure}",
      "class": "Illuminate\\Pipeline\\Pipeline",
      "type": "->"
    },
    {
      "file": "E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php",
      "line": 171,
      "function": "handle",
      "class": "Nuwave\\Lighthouse\\Support\\Http\\Middleware\\AttemptAuthentication",
      "type": "->"
    },
    {
      "file": "E:\\wwwroot\\object\\vendor\\nuwave\\lighthouse\\src\\Support\\Http\\Middleware\\AcceptJson.php",
      "line": 27,
      "function": "Illuminate\\Pipeline\\{closure}",
      "class": "Illuminate\\Pipeline\\Pipeline",
      "type": "->"
    },
    {
      "file": "E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php",
      "line": 171,
      "function": "handle",
      "class": "Nuwave\\Lighthouse\\Support\\Http\\Middleware\\AcceptJson",
      "type": "->"
    },
    {
      "file": "E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php",
      "line": 105,
      "function": "Illuminate\\Pipeline\\{closure}",
      "class": "Illuminate\\Pipeline\\Pipeline",
      "type": "->"
    },
    {
      "file": "E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Router.php",
      "line": 683,
      "function": "then",
      "class": "Illuminate\\Pipeline\\Pipeline",
      "type": "->"
    },
    {
      "file": "E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Router.php",
      "line": 658,
      "function": "runRouteWithinStack",
      "class": "Illuminate\\Routing\\Router",
      "type": "->"
    },
    {
      "file": "E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Router.php",
      "line": 624,
      "function": "runRoute",
      "class": "Illuminate\\Routing\\Router",
      "type": "->"
    },
    {
      "file": "E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Router.php",
      "line": 613,
      "function": "dispatchToRoute",
      "class": "Illuminate\\Routing\\Router",
      "type": "->"
    },
    {
      "file": "E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Foundation\\Http\\Kernel.php",
      "line": 170,
      "function": "dispatch",
      "class": "Illuminate\\Routing\\Router",
      "type": "->"
    },
    {
      "file": "E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php",
      "line": 130,
      "function": "Illuminate\\Foundation\\Http\\{closure}",
      "class": "Illuminate\\Foundation\\Http\\Kernel",
      "type": "->"
    },
    {
      "file": "E:\\wwwroot\\object\\vendor\\barryvdh\\laravel-debugbar\\src\\Middleware\\InjectDebugbar.php",
      "line": 67,
      "function": "Illuminate\\Pipeline\\{closure}",
      "class": "Illuminate\\Pipeline\\Pipeline",
      "type": "->"
    },
    {
      "file": "E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php",
      "line": 171,
      "function": "handle",
      "class": "Barryvdh\\Debugbar\\Middleware\\InjectDebugbar",
      "type": "->"
    },
    {
      "file": "E:\\wwwroot\\object\\app\\Http\\Middleware\\ChangeAppUrlMiddleware.php",
      "line": 23,
      "function": "Illuminate\\Pipeline\\{closure}",
      "class": "Illuminate\\Pipeline\\Pipeline",
      "type": "->"
    },
    {
      "file": "E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php",
      "line": 171,
      "function": "handle",
      "class": "App\\Http\\Middleware\\ChangeAppUrlMiddleware",
      "type": "->"
    },
    {
      "file": "E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest.php",
      "line": 21,
      "function": "Illuminate\\Pipeline\\{closure}",
      "class": "Illuminate\\Pipeline\\Pipeline",
      "type": "->"
    },
    {
      "file": "E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php",
      "line": 171,
      "function": "handle",
      "class": "Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest",
      "type": "->"
    },
    {
      "file": "E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest.php",
      "line": 21,
      "function": "Illuminate\\Pipeline\\{closure}",
      "class": "Illuminate\\Pipeline\\Pipeline",
      "type": "->"
    },
    {
      "file": "E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php",
      "line": 171,
      "function": "handle",
      "class": "Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest",
      "type": "->"
    },
    {
      "file": "E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Foundation\\Http\\Middleware\\ValidatePostSize.php",
      "line": 27,
      "function": "Illuminate\\Pipeline\\{closure}",
      "class": "Illuminate\\Pipeline\\Pipeline",
      "type": "->"
    },
    {
      "file": "E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php",
      "line": 171,
      "function": "handle",
      "class": "Illuminate\\Foundation\\Http\\Middleware\\ValidatePostSize",
      "type": "->"
    },
    {
      "file": "E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Foundation\\Http\\Middleware\\CheckForMaintenanceMode.php",
      "line": 63,
      "function": "Illuminate\\Pipeline\\{closure}",
      "class": "Illuminate\\Pipeline\\Pipeline",
      "type": "->"
    },
    {
      "file": "E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php",
      "line": 171,
      "function": "handle",
      "class": "Illuminate\\Foundation\\Http\\Middleware\\CheckForMaintenanceMode",
      "type": "->"
    },
    {
      "file": "E:\\wwwroot\\object\\vendor\\fideloper\\proxy\\src\\TrustProxies.php",
      "line": 57,
      "function": "Illuminate\\Pipeline\\{closure}",
      "class": "Illuminate\\Pipeline\\Pipeline",
      "type": "->"
    },
    {
      "file": "E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php",
      "line": 171,
      "function": "handle",
      "class": "Fideloper\\Proxy\\TrustProxies",
      "type": "->"
    },
    {
      "file": "E:\\wwwroot\\object\\vendor\\dingo\\api\\src\\Http\\Middleware\\Request.php",
      "line": 111,
      "function": "Illuminate\\Pipeline\\{closure}",
      "class": "Illuminate\\Pipeline\\Pipeline",
      "type": "->"
    },
    {
      "file": "E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php",
      "line": 171,
      "function": "handle",
      "class": "Dingo\\Api\\Http\\Middleware\\Request",
      "type": "->"
    },
    {
      "file": "E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php",
      "line": 105,
      "function": "Illuminate\\Pipeline\\{closure}",
      "class": "Illuminate\\Pipeline\\Pipeline",
      "type": "->"
    },
    {
      "file": "E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Foundation\\Http\\Kernel.php",
      "line": 145,
      "function": "then",
      "class": "Illuminate\\Pipeline\\Pipeline",
      "type": "->"
    },
    {
      "file": "E:\\wwwroot\\object\\vendor\\laravel\\framework\\src\\Illuminate\\Foundation\\Http\\Kernel.php",
      "line": 110,
      "function": "sendRequestThroughRouter",
      "class": "Illuminate\\Foundation\\Http\\Kernel",
      "type": "->"
    },
    {
      "file": "E:\\wwwroot\\object\\public\\index.php",
      "line": 57,
      "function": "handle",
      "class": "Illuminate\\Foundation\\Http\\Kernel",
      "type": "->"
    }
  ]
}

7、调整类 Modules\\OnlineStoreThemeGraphQL\\Resolver\\OnlineStoreTheme\\TemplateDetailsResolver 中的方法 __invoke。删除掉 yield 的循环。方法 __invoke 能够被执行到。如图3

图3

    public function __invoke($rootValue, array $args, GraphQLContext $context, ResolveInfo $resolveInfo)
    {
        echo 44;
        exit;
        $themeId = $rootValue['templateSettingsData']['theme_id'];
        $basename = $args['basename'];
        $rawSchemaLoader = $this->themeContext
            ->getThemeViewFactory()
            ->createRawSchemaLoader();

        $rawSchemaLoaderAdapter = new RawSchemaLoaderAdapter($rawSchemaLoader);
        $sessionId = $rootValue['session_id']?? null;
        $rawSchemaLoaderAdapter->setSessionId($sessionId);

        try {
            $rawSchema = $rawSchemaLoaderAdapter->loadTemplateSchema($basename);

            $template = new Template();

            $this->templateBuilder->build($rawSchema, $template);
        } catch(\Exception $e) {
            throw new GraphQlInputException($e->getMessage());
        }

        $id = new Id([$themeId, $basename]);

    }
永夜