成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

[譯+] Laravel GraphQL ReadMe 文檔

fnngj / 1192人閱讀

摘要:原文地址使用語法從版本開始可以定義多個語法如果您想要一個公共的入口,另一個需要身份驗證的入口,那么擁有多個語法是非常有用的。

原文地址:

readme.md

advanced.md

使用 語法 / Schemas

從 1.0 版本開始, 可以定義多個語法, 如果您想要一個公共的入口,另一個需要身份驗證的入口,那么擁有多個語法是非常有用的。

您可以在配置中定義多個語法:

"schema" => "default",

"schemas" => [
    "default" => [
        "query" => [
            //"users" => "AppGraphQLQueryUsersQuery"
        ],
        "mutation" => [
            //"updateUserEmail" => "AppGraphQLQueryUpdateUserEmailMutation"
        ]
    ],
    "secret" => [
        "query" => [
            //"users" => "AppGraphQLQueryUsersQuery"
        ],
        "mutation" => [
            //"updateUserEmail" => "AppGraphQLQueryUpdateUserEmailMutation"
        ]
    ]
]

或者可以使用 facade 來添加語法

GraphQL::addSchema("secret", [
    "query" => [
        "users" => "AppGraphQLQueryUsersQuery"
    ],
    "mutation" => [
        "updateUserEmail" => "AppGraphQLQueryUpdateUserEmailMutation"
    ]
]);

隨后, 你可以使用 facade 來創(chuàng)建語法

// Will return the default schema defined by "schema" in the config
$schema = GraphQL::schema();

// Will return the "secret" schema
$schema = GraphQL::schema("secret");

// Will build a new schema
$schema = GraphQL::schema([
    "query" => [
        //"users" => "AppGraphQLQueryUsersQuery"
    ],
    "mutation" => [
        //"updateUserEmail" => "AppGraphQLQueryUpdateUserEmailMutation"
    ]
]);

你可以通過指定的語法來訪問

// Default schema
http://homestead.app/graphql?query=query+FetchUsers{users{id,email}}

// Secret schema
http://homestead.app/graphql/secret?query=query+FetchUsers{users{id,email}}
創(chuàng)建查詢

首先你需要創(chuàng)建一個類型

namespace AppGraphQLType;

use GraphQLTypeDefinitionType;
use FolkloreGraphQLSupportType as GraphQLType;

class UserType extends GraphQLType
{
    protected $attributes = [
        "name" => "User",
        "description" => "A user"
    ];

    /*
    * Uncomment following line to make the type input object.
    * http://graphql.org/learn/schema/#input-types
    */
    // protected $inputObject = true;

    public function fields()
    {
        return [
            "id" => [
                "type" => Type::nonNull(Type::string()),
                "description" => "The id of the user"
            ],
            "email" => [
                "type" => Type::string(),
                "description" => "The email of user"
            ]
        ];
    }

    // If you want to resolve the field yourself, you can declare a method
    // with the following format resolve[FIELD_NAME]Field()
    protected function resolveEmailField($root, $args)
    {
        return strtolower($root->email);
    }
}

然后將類型添加到 config/graphql.php 文件中

"types" => [
    "User" => "AppGraphQLTypeUserType"
]

你也可以使用 GraphQL Facade 來進行添加, 添加到 service provider 中

GraphQL::addType("AppGraphQLTypeUserType", "User");

然后, 你需要定義一個查詢并且返回這個類型(或者列表). 你同樣也可以在指定的參數(shù), 這些參數(shù)可以用在 resolve 方法中.

namespace AppGraphQLQuery;

use GraphQL;
use GraphQLTypeDefinitionType;
use FolkloreGraphQLSupportQuery;
use AppUser;

class UsersQuery extends Query
{
    protected $attributes = [
        "name" => "users"
    ];

    public function type()
    {
        return Type::listOf(GraphQL::type("User"));
    }

    public function args()
    {
        return [
            "id" => ["name" => "id", "type" => Type::string()],
            "email" => ["name" => "email", "type" => Type::string()]
        ];
    }

    public function resolve($root, $args)
    {
        if (isset($args["id"])) {
            return User::where("id" , $args["id"])->get();
        } else if(isset($args["email"])) {
            return User::where("email", $args["email"])->get();
        } else {
            return User::all();
        }
    }
}

添加 query 到 config/graphql.php 文件中

"schemas" => [
    "default" => [
        "query" => [
            "users" => "AppGraphQLQueryUsersQuery"
        ],
        // ...
    ]
]

這樣就OK了, 你可以使用 /graphql 來進行查詢了. 嘗試使用 get 請求來獲取下數(shù)據(jù)

query FetchUsers {
  users {
    id
    email
  }
}

或者使用 url 地址來進行請求

http://homestead.app/graphql?query=query+FetchUsers{users{id,email}}
創(chuàng)建修改

更改就是另外一種形式的查詢, 他接受參數(shù)(用來進行更改或者創(chuàng)建使用的)并且返回一個對象或者指定的類型

例如使用修改來更新用戶的密碼, 首先你需要定義 mutation

namespace AppGraphQLMutation;

use GraphQL;
use GraphQLTypeDefinitionType;
use FolkloreGraphQLSupportMutation;
use AppUser;

class UpdateUserPasswordMutation extends Mutation
{
    protected $attributes = [
        "name" => "updateUserPassword"
    ];

    public function type()
    {
        return GraphQL::type("User");
    }

    public function args()
    {
        return [
            "id" => ["name" => "id", "type" => Type::nonNull(Type::string())],
            "password" => ["name" => "password", "type" => Type::nonNull(Type::string())]
        ];
    }

    public function resolve($root, $args)
    {
        $user = User::find($args["id"]);

        if (!$user) {
            return null;
        }

        $user->password = bcrypt($args["password"]);
        $user->save();

        return $user;
    }
}

就想 resolve 方法. 你使用參數(shù)來更新你的模型并且返回她.

然后添加 mutation 到 config/graphql.php 文件中

"schema" => [
    "default" => [
        "mutation" => [
            "updateUserPassword" => "AppGraphQLMutationUpdateUserPasswordMutation"
        ],
        // ...
    ]
]

你可以使用如下的查詢來進行修改

mutation users {
  updateUserPassword(id: "1", password: "newpassword") {
    id
    email
  }
}

url 中可以如下請求

http://homestead.app/graphql?query=mutation+users{updateUserPassword(id: "1", password: "newpassword"){id,email}}
添加修改驗證

在修改中增加驗證是可以的. 老鐵. 它使用 laravel Validator 來處理驗證并且返回相應(yīng)的參數(shù).

當(dāng)創(chuàng)建 mutation 的時候, 你可以添加如下方法來定義驗證規(guī)則:

namespace AppGraphQLMutation;

use GraphQL;
use GraphQLTypeDefinitionType;
use FolkloreGraphQLSupportMutation;
use AppUser;

class UpdateUserEmailMutation extends Mutation
{
    protected $attributes = [
        "name" => "UpdateUserEmail"
    ];

    public function type()
    {
        return GraphQL::type("User");
    }

    public function args()
    {
        return [
            "id" => ["name" => "id", "type" => Type::string()],
            "email" => ["name" => "email", "type" => Type::string()]
        ];
    }

    public function rules()
    {
        return [
            "id" => ["required"],
            "email" => ["required", "email"]
        ];
    }

    public function resolve($root, $args)
    {
        $user = User::find($args["id"]);

        if (!$user) {
            return null;
        }

        $user->email = $args["email"];
        $user->save();

        return $user;
    }
}

同樣, 你可以在參數(shù)中定義規(guī)則:

class UpdateUserEmailMutation extends Mutation
{
    //...

    public function args()
    {
        return [
            "id" => [
                "name" => "id",
                "type" => Type::string(),
                "rules" => ["required"]
            ],
            "email" => [
                "name" => "email",
                "type" => Type::string(),
                "rules" => ["required", "email"]
            ]
        ];
    }

    //...
}

當(dāng)你執(zhí)行修改的時候, 會返回驗證錯誤. 由于 GraphQL 規(guī)范定義了錯誤的格式,因此會將驗證錯誤消息作為額外的 validation 屬性添加到錯誤對象中。為了找到驗證錯誤,應(yīng)該檢查一個 message 等于 validation 的時候,然后 validation 屬性將包含 Laravel Validator 返回的正常錯誤消息信息.

{
  "data": {
    "updateUserEmail": null
  },
  "errors": [
    {
      "message": "validation",
      "locations": [
        {
          "line": 1,
          "column": 20
        }
      ],
      "validation": {
        "email": [
          "The email is invalid."
        ]
      }
    }
  ]
}
高級用法 查詢變量

GraphQL 允許你使用變量來查詢數(shù)據(jù), 從而不用在查詢中硬編碼值. 如下

query FetchUserByID($id: String) {
    user(id: $id) {
        id
        email
    }
}

當(dāng)你查詢 GraphQL 的時候可以傳遞 variables 參數(shù)

http://homestead.app/graphql?query=query+FetchUserByID($id:String){user(id:$id){id,email}}&variables={"id":"1"}
查詢嵌入資源

如果想查詢嵌入資源

query FetchUser{
    user(id: 123456789) {
        id
        posts(id: 987654321) {
            id
        }
    }
}

你需要在 UserType 中添加 post 字段并且實現(xiàn) resolveField 方法

public function fields()
{
    return [
        "id" => [
            "type"        => Type::nonNull(Type::string()),
            "description" => "Id of user",
        ],
        "posts" => [
            "args" => [
                "id" => [
                    "type"        => Type::string(),
                    "description" => "id of the post",
                ],
            ],
            "type"        => Type::listOf(GraphQL::type("Post")),
            "description" => "post description",
        ],
    ];
}
    
public function resolvePostsField($root, $args)
{
    if (isset($args["id"])) {
        return  $root->posts->where("id", $args["id"]);
    }

    return $root->posts;
}
枚舉

美劇類型是一個特殊類型的標量變量, 用來限制一系列的允許的數(shù)據(jù), 可以查看這里閱讀更多的信息

首先創(chuàng)建一個 Enum 作為 GraphQLType 的擴展類型

 "Episode",
        "description" => "The types of demographic elements",
        "values" => [
            "NEWHOPE" => "NEWHOPE",
            "EMPIRE" => "EMPIRE",
            "JEDI" => "JEDI",
        ],
    ];
}

注冊 Enum 在 config/graphql.phptypes 數(shù)組

// config/graphql.php
"types" => [TestEnum" => TestEnumType::class ];

然后如下使用

 [
                "type" => GraphQL::type("TestEnum")
            ]
        ]
   }
}
接口

你可以使用接口來限制一系列的字段, 閱讀更多的消息點擊這里

一系列的接口

 "Character",
            "description" => "Character interface.",
        ];
    
        public function fields() {
            return [
                "id" => [
                    "type" => Type::nonNull(Type::int()),
                    "description" => "The id of the character."
                ],
                "appearsIn" => [
                    "type" => Type::nonNull(Type::listOf(GraphQL::type("Episode"))),
                    "description" => "A list of episodes in which the character has an appearance."
                ],
            ];
        }
    
        public function resolveType($root) {
            // Use the resolveType to resolve the Type which is implemented trough this interface
            $type = $root["type"];
            if ($type === "human") {
                return GraphQL::type("Human");
            } else if  ($type === "droid") {
                return GraphQL::type("Droid");
            }
        }
}

類型實現(xiàn)

 "Human",
        "description" => "A human."
    ];

    public function fields() {
        return [
            "id" => [
                "type" => Type::nonNull(Type::int()),
                "description" => "The id of the human.",
            ],
            "appearsIn" => [
                "type" => Type::nonNull(Type::listOf(GraphQL::type("Episode"))),
                "description" => "A list of episodes in which the human has an appearance."
            ],
            "totalCredits" => [
                "type" => Type::nonNull(Type::int()),
                "description" => "The total amount of credits this human owns."
            ]
        ];
    }

    public function interfaces() {
        return [
            GraphQL::type("Character")
        ];
    }
}
自定義字段

你同樣可以定義一個字段類, 如果你想在多個類型中重用他們.

namespace AppGraphQLFields;

use GraphQLTypeDefinitionType;
use FolkloreGraphQLSupportField;

class PictureField extends Field {

        protected $attributes = [
        "description" => "A picture"
    ];

    public function type(){
        return Type::string();
    }

    public function args()
    {
        return [
            "width" => [
                "type" => Type::int(),
                "description" => "The width of the picture"
            ],
            "height" => [
                "type" => Type::int(),
                "description" => "The height of the picture"
            ]
        ];
    }

    protected function resolve($root, $args)
    {
        $width = isset($args["width"]) ? $args["width"]:100;
        $height = isset($args["height"]) ? $args["height"]:100;
        return "http://placehold.it/".$width."x".$height;
    }

}

你可以在 type 聲明中使用他們

namespace AppGraphQLType;

use GraphQLTypeDefinitionType;
use FolkloreGraphQLSupportType as GraphQLType;

use AppGraphQLFieldsPictureField;

class UserType extends GraphQLType {

        protected $attributes = [
        "name" => "User",
        "description" => "A user"
    ];

    public function fields()
    {
        return [
            "id" => [
                "type" => Type::nonNull(Type::string()),
                "description" => "The id of the user"
            ],
            "email" => [
                "type" => Type::string(),
                "description" => "The email of user"
            ],
            //Instead of passing an array, you pass a class path to your custom field
            "picture" => PictureField::class
        ];
    }

}
加載關(guān)聯(lián)關(guān)系

傳遞給 query 的 resolve 方法的第三個參數(shù)是 GraphQLTypeDefinitionResolveInfo 的實例, 允許你從請求中取回指定的 key. 下面是一個使用這個參數(shù)的例子來獲取關(guān)聯(lián)模型的數(shù)據(jù). 如下

namespace AppGraphQLQuery;

use GraphQL;
use GraphQLTypeDefinitionType;
use GraphQLTypeDefinitionResolveInfo;
use FolkloreGraphQLSupportQuery;

use AppUser;

class UsersQuery extends Query
{
    protected $attributes = [
        "name" => "Users query"
    ];

    public function type()
    {
        return Type::listOf(GraphQL::type("user"));
    }

    public function args()
    {
        return [
            "id" => ["name" => "id", "type" => Type::string()],
            "email" => ["name" => "email", "type" => Type::string()]
        ];
    }

    public function resolve($root, $args, $context, ResolveInfo $info)
    {
        $fields = $info->getFieldSelection($depth = 3);

        $users = User::query();

        foreach ($fields as $field => $keys) {
            if ($field === "profile") {
                $users->with("profile");
            }

            if ($field === "posts") {
                $users->with("posts");
            }
        }

        return $users->get();
    }
}

你的 UserType 可能看起來是這個樣子的

 "User",
        "description" => "A user",
    ];

    /**
     * @return array
     */
    public function fields()
    {
        return [
            "uuid" => [
                "type" => Type::nonNull(Type::string()),
                "description" => "The uuid of the user"
            ],
            "email" => [
                "type" => Type::nonNull(Type::string()),
                "description" => "The email of user"
            ],
            "profile" => [
                "type" => GraphQL::type("Profile"),
                "description" => "The user profile",
            ],
            "posts" => [
                "type" => Type::listOf(GraphQL::type("Post")),
                "description" => "The user posts",
            ]
        ];
    }
}

這樣我們有一個 profile 和一個 post 類型作為期待的返回關(guān)聯(lián)關(guān)系數(shù)據(jù)

class ProfileType extends GraphQLType
{
    protected $attributes = [
        "name" => "Profile",
        "description" => "A user profile",
    ];

    public function fields()
    {
        return [
            "name" => [
                "type" => Type::string(),
                "description" => "The name of user"
            ]
        ];
    }
}
class PostType extends GraphQLType
{
    protected $attributes = [
        "name" => "Post",
        "description" => "A post",
    ];

    public function fields()
    {
        return [
            "title" => [
                "type" => Type::nonNull(Type::string()),
                "description" => "The title of the post"
            ],
            "body" => [
                "type" => Type::string(),
                "description" => "The body the post"
            ]
        ];
    }
}

最后你的查詢可能是這個樣子, 使用 URL

http://homestead.app/graphql?query=query+FetchUsers{users{uuid, email, team{name}}}

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/26278.html

相關(guān)文章

  • PHP / Laravel API 開發(fā)推薦閱讀清單

    showImg(https://segmentfault.com/img/bV6aHV?w=1280&h=800); 社區(qū)優(yōu)秀文章 Laravel 5.5+passport 放棄 dingo 開發(fā) API 實戰(zhàn),讓 API 開發(fā)更省心 - 自造車輪。 API 文檔神器 Swagger 介紹及在 PHP 項目中使用 - API 文檔撰寫方案 推薦 Laravel API 項目必須使用的 8 個...

    shmily 評論0 收藏0
  • Laravel 應(yīng)用中構(gòu)建 GraphQL API

    摘要:代碼示例產(chǎn)品列表和用戶列表的例子昨天我們學(xué)習(xí)了在中搭建環(huán)境,現(xiàn)在我們來學(xué)習(xí)的。可以提升調(diào)用的靈活性,我們可以像寫數(shù)據(jù)庫查詢語句一樣來請求來獲取所需要的數(shù)據(jù),這對構(gòu)建復(fù)雜的查詢來說非常有用。 showImg(https://segmentfault.com/img/remote/1460000017906835?w=1280&h=720); 代碼示例:產(chǎn)品列表和用戶列表的 API 例子 ...

    X_AirDu 評論0 收藏0
  • 如何利用GitHub GraphQL API開發(fā)個人博客?

    摘要:獲取標簽及相關(guān)通常,我們會在博客首頁設(shè)計一個有分類的文章列表,這就要求在發(fā)布時需要選擇對應(yīng)的。這里我用的是的和的庫,核心代碼如下結(jié)合開發(fā)個人博客的核心內(nèi)容基本就這么多了,具體代碼歡迎查看,一起踩坑。 作為一個程序員,搭建一個個人博客幾乎是所有人的需求,一來比較酷,二來也可以記錄自己的學(xué)習(xí)和生活總結(jié)。但如果你不是全棧工程師,實現(xiàn)這個需求還是有點麻煩。后端搭建一套現(xiàn)有的前端框架及前端寫AP...

    fireflow 評論0 收藏0
  • koa2 + graphql + typescript + jwt + typeorm的nodejs

    最近寫了一個node項目,主要使用到的技術(shù)有: koa2 // nodejs 框架 koa-router // koa路由 graphql // 查詢api typescript // 強類型語言 jwt // 授權(quán) typeorm // typescript的一個orm mysql2 // 內(nèi)容數(shù)據(jù)庫 mongodb // 日志存儲數(shù)據(jù)庫 redis // 服務(wù)器緩存 項目結(jié)構(gòu):sh...

    Dogee 評論0 收藏0

發(fā)表評論

0條評論

fnngj

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<