GraphQLBundle, GraphQL服务器的纯PHP实现- Symfony包

分享于 

9分钟阅读

GitHub

  繁體 雙語
Pure PHP implementation of GraphQL Server – Symfony Bundle
  • 源代码名称:GraphQLBundle
  • 源代码网址:http://www.github.com/Youshido/GraphQLBundle
  • GraphQLBundle源代码文档
  • GraphQLBundle源代码下载
  • Git URL:
    git://www.github.com/Youshido/GraphQLBundle.git
    Git Clone代码到本地:
    git clone http://www.github.com/Youshido/GraphQLBundle
    Subversion代码到本地:
    $ svn co --depth empty http://www.github.com/Youshido/GraphQLBundle
    Checked out revision 1.
    $ cd repo
    $ svn up trunk
    
    GraphQl包

    :这是基于纯PHP GraphQL服务器插件实现的包。

    这个包为你提供:

    • GraphQL的 RFC规范完全兼容
    • 面向对象的面向对象架构构建GraphQL架构
    • 直观的类型系统,使你能够快速构建项目并保持一致
    • 为你开发的GraphQL模式构建验证
    • 具有大量示例的文档化类
    • 自动创建端点/graphql 以处理请求

    这里有演示应用程序,演示如何构建我们的API,见 GraphQLDemoApp插件。

    table-内容

    安装

    如果你没有,我们假设你有 composer,从官方网站安装。
    如果你需要帮助,这里的框架是链接 http://symfony.com/doc/current/book/installation.html。

    安装Symfony的快捷方式: composer create-project symfony/framework-standard-edition my_project_name

    启动 Composer 并运行后,就可以安装GraphQL包了。
    转到项目文件夹并运行:

    composer require youshido/graphql-bundle

    然后在 app/AppKernel.php 中启用捆绑包

    newYoushidoGraphQLBundleGraphQLBundle(),

    将路由引用添加到 app/config/routing.yml:

    graphql:
     resource: "@GraphQLBundle/Controller/"

    或者

    graphql:
     resource: "@GraphQLBundle/Resources/config/route.xml"

    如果没有配置web服务器,你可以使用捆绑的版本,只需运行 php bin/console server:run

    让我们检查一下你是否做了一切正确的事情- 尝试访问 url localhost:8000/graphql
    你应该得到一个带有以下错误的JSON响应:

    {"errors":[{"message":"Schema class does not exist"}]}

    那是因为还没有为处理器指定GraphQL模式。 你需要创建一个GraphQL模式类,并将它设置为你的文件。

    你可以使用 inline 方法并不创建架构类,以便定义你自己的GraphQL控制器并使用 ->setSchema 方法。

    创建架构类的最快方法是使用这里分发包附带的生成器:

    php bin/console graphql:configure AppBundle

    这里是AppBundle的名称,该包将在其中生成类。
    你将被要求确认创建类。

    向配置文件添加参数后,尝试在浏览器中访问以下链接。 http://localhost:8000/graphql?query={hello(name:World)}

    或者,你可以在控制台中使用CURL客户端执行相同的请求
    curl http://localhost:8000/graphql --data"query={ hello(name:"World") }"

    将显示来自测试架构的成功响应:

    {"data":{"hello":"world!"}}

    这意味着你已经为Symfony框架配置了GraphQL包,现在可以构建你的GraphQL架构:

    下一步是通过执行以下命令来链接GraphiQL资源管理器的资源:

    php bin/console assets:install --symlink

    现在你可以在 http://localhost:8000/graphql/explorer

    功能

    类 AbstractContainerAwareField:

    AbstractContainerAwareField类用于自动传递容器到字段,在解析函数中添加容器的能力:

    classRootDirFieldextendsAbstractContainerAwareField{/** * @inheritdoc*/publicfunctiongetType() {returnnewStringType(); }/** * @inheritdoc*/publicfunctionresolve($value, array$args, ResolveInfo$info) {return$this->container->getParameter('kernel.root_dir'); }/** * @inheritdoc*/publicfunctiongetName() {return'rootDir'; }

    服务方法可以调用:

    能够将服务方法传递为解析调用:

    $config->addField(newField(['name'=>'cacheDir','type'=>newStringType(),'resolve'=> ['@resolve_service', 'getCacheDir']]))

    事件:

    你可以使用Symfony事件调度程序来控制在解析graphql查询时发生的特定事件。

    namespace........;useYoushidoGraphQLEventResolveEvent;useSymfonyComponentEventDispatcherEventSubscriberInterface;classMyGraphQLResolveEventSubscriberimplementsEventSubscriberInterface{publicstaticfunctiongetSubscribedEvents() {return ['graphql.pre_resolve'=>'onPreResolve','graphql.post_resolve'=>'onPostResolve' ]; }publicfunctiononPreResolve(ResolveEvent$event) {//$event->getFields/$event->getAstFields().. }publicfunctiononPostResolve(ResolveEvent$event) {//$event->getFields/$event->getAstFields().. }}
    配置

    现在配置订阅服务器以便捕获事件。 这可以通过 XML。Yaml或者PHP在Symfony中完成。

    <serviceid="my_own_bundle.event_subscriber.my_graphql_resolve_event_subscriber"class=".........MyGraphQLResolveEventSubscriber">
     <tagname="graphql.event_subscriber"/>
    </service>

    服务器级安全性:

    包提供了两种保护应用程序的方法: 使用黑/白操作列表或者使用安全选民。

    黑/白列表

    用于保护某些 root 操作。 要启用它,你需要在 config.yml file: 中编写以下

    graphql:
     #...security:
     black_list: ['hello'] # or white_list: ['hello']
    使用安全投票者:

    用于保护任何字段解析并支持两种类型的警卫: root 操作和任何解析(。包含内部字段,标量类型字段,root 操作)的字段。 要使用指定逻辑保护 root 操作,你需要在配置和使用中启用它 SecurityManagerInterface::RESOLVE_ROOT_OPERATION_ATTRIBUTE 属性。同样的事情需要做到启用字段保护,但在本例中使用 SecurityManagerInterface::RESOLVE_FIELD_ATTRIBUTE 属性。官方文档关于投票者。

    注意:启用字段安全性会显著降低性能

    配置示例:

    graphql:
     security:
     guard:
     field: true # for any field securityoperation: true # for root level security

    投票示例(。使用标记 security.voter 添加到你的services.yml 文件中):

    useSymfonyComponentSecurityCoreAuthenticationTokenTokenInterface;useSymfonyComponentSecurityCoreAuthorizationVoterVoter;useYoushidoGraphQLExecutionResolveInfo;useYoushidoGraphQLBundleSecurityManagerSecurityManagerInterface;classGraphQLVoterextendsVoter{/** * @inheritdoc*/protectedfunctionsupports($attribute, $subject) {returnin_array($attribute, [SecurityManagerInterface::RESOLVE_FIELD_ATTRIBUTE, SecurityManagerInterface::RESOLVE_ROOT_OPERATION_ATTRIBUTE]); }/** * @inheritdoc*/protectedfunctionvoteOnAttribute($attribute, $subject, TokenInterface$token) {// your own validation logic hereif (SecurityManagerInterface::RESOLVE_FIELD_ATTRIBUTE==$attribute) {/** @var $subject ResolveInfo */if ($subject->getField()->getName() =='hello') {returnfalse; }returntrue; } elseif (SecurityManagerInterface::RESOLVE_ROOT_OPERATION_ATTRIBUTE==$attribute) {/** @var $subject Query */if ($subject->getName() =='__schema') {returntrue; } } }}

    GraphiQL扩展:

    若要运行 graphiql扩展插件,只需尝试访问http://your_domain/graphql/explorer

    文档

    所有详细文档均可以在主GraphQL存储库- http://github.com/youshido/graphql/ 上获得。


    相关文章