摘要:原文地址使用語法從版本開始可以定義多個語法如果您想要一個公共的入口,另一個需要身份驗證的入口,那么擁有多個語法是非常有用的。
原文地址:
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 來創建語法
// 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}}創建查詢
首先你需要創建一個類型
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");
然后, 你需要定義一個查詢并且返回這個類型(或者列表). 你同樣也可以在指定的參數, 這些參數可以用在 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 請求來獲取下數據
query FetchUsers { users { id email } }
或者使用 url 地址來進行請求
http://homestead.app/graphql?query=query+FetchUsers{users{id,email}}創建修改
更改就是另外一種形式的查詢, 他接受參數(用來進行更改或者創建使用的)并且返回一個對象或者指定的類型
例如使用修改來更新用戶的密碼, 首先你需要定義 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 方法. 你使用參數來更新你的模型并且返回她.
然后添加 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 來處理驗證并且返回相應的參數.
當創建 mutation 的時候, 你可以添加如下方法來定義驗證規則:
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; } }
同樣, 你可以在參數中定義規則:
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"] ] ]; } //... }
當你執行修改的時候, 會返回驗證錯誤. 由于 GraphQL 規范定義了錯誤的格式,因此會將驗證錯誤消息作為額外的 validation 屬性添加到錯誤對象中。為了找到驗證錯誤,應該檢查一個 message 等于 validation 的時候,然后 validation 屬性將包含 Laravel Validator 返回的正常錯誤消息信息.
{ "data": { "updateUserEmail": null }, "errors": [ { "message": "validation", "locations": [ { "line": 1, "column": 20 } ], "validation": { "email": [ "The email is invalid." ] } } ] }高級用法 查詢變量
GraphQL 允許你使用變量來查詢數據, 從而不用在查詢中硬編碼值. 如下
query FetchUserByID($id: String) { user(id: $id) { id email } }
當你查詢 GraphQL 的時候可以傳遞 variables 參數
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 字段并且實現 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; }枚舉
美劇類型是一個特殊類型的標量變量, 用來限制一系列的允許的數據, 可以查看這里閱讀更多的信息
首先創建一個 Enum 作為 GraphQLType 的擴展類型
"Episode", "description" => "The types of demographic elements", "values" => [ "NEWHOPE" => "NEWHOPE", "EMPIRE" => "EMPIRE", "JEDI" => "JEDI", ], ]; }
注冊 Enum 在 config/graphql.php 的 types 數組
// 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"); } } }
類型實現
"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 ]; } }加載關聯關系
傳遞給 query 的 resolve 方法的第三個參數是 GraphQLTypeDefinitionResolveInfo 的實例, 允許你從請求中取回指定的 key. 下面是一個使用這個參數的例子來獲取關聯模型的數據. 如下
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 類型作為期待的返回關聯關系數據
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}}}
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/26278.html
showImg(https://segmentfault.com/img/bV6aHV?w=1280&h=800); 社區優秀文章 Laravel 5.5+passport 放棄 dingo 開發 API 實戰,讓 API 開發更省心 - 自造車輪。 API 文檔神器 Swagger 介紹及在 PHP 項目中使用 - API 文檔撰寫方案 推薦 Laravel API 項目必須使用的 8 個...
摘要:代碼示例產品列表和用戶列表的例子昨天我們學習了在中搭建環境,現在我們來學習的。可以提升調用的靈活性,我們可以像寫數據庫查詢語句一樣來請求來獲取所需要的數據,這對構建復雜的查詢來說非常有用。 showImg(https://segmentfault.com/img/remote/1460000017906835?w=1280&h=720); 代碼示例:產品列表和用戶列表的 API 例子 ...
摘要:獲取標簽及相關通常,我們會在博客首頁設計一個有分類的文章列表,這就要求在發布時需要選擇對應的。這里我用的是的和的庫,核心代碼如下結合開發個人博客的核心內容基本就這么多了,具體代碼歡迎查看,一起踩坑。 作為一個程序員,搭建一個個人博客幾乎是所有人的需求,一來比較酷,二來也可以記錄自己的學習和生活總結。但如果你不是全棧工程師,實現這個需求還是有點麻煩。后端搭建一套現有的前端框架及前端寫AP...
最近寫了一個node項目,主要使用到的技術有: koa2 // nodejs 框架 koa-router // koa路由 graphql // 查詢api typescript // 強類型語言 jwt // 授權 typeorm // typescript的一個orm mysql2 // 內容數據庫 mongodb // 日志存儲數據庫 redis // 服務器緩存 項目結構:sh...
閱讀 3114·2021-11-23 09:51
閱讀 1974·2021-09-09 09:32
閱讀 1084·2019-08-30 15:53
閱讀 2957·2019-08-30 11:19
閱讀 2464·2019-08-29 14:15
閱讀 1432·2019-08-29 13:52
閱讀 553·2019-08-29 12:46
閱讀 2818·2019-08-26 12:18