Используйте Facebook GraphQL с Laravel 5 или Lumen. Здесь он основан на реализации PHP. Дополнительную информацию о GraphQL можно найти в разделе «Введение в GraphQL» в блоге React или прочитать спецификации GraphQL. Это работа в стадии разработки.
Этот пакет совместим с моделью Eloquent (или любым другим источником данных). См. пример ниже.
Выпущена версия 1.0. Если вы обновляетесь со старой версии, вы можете выбрать «Обновить до 1.0».
1- Запросите пакет через Composer в вашем composer.json
.
{
"require" : {
"folklore/graphql" : " ~1.0.0 "
}
}
2- Запустите Composer, чтобы установить или обновить новое требование.
$ composer install
или
$ composer update
1- Опубликовать файл конфигурации
$ php artisan vendor:publish --provider= " FolkloreGraphQLServiceProvider "
2- Просмотрите файл конфигурации.
config/graphql.php
1- Добавьте поставщика услуг в файл config/app.php
Folklore GraphQL ServiceProvider::class,
2- Добавьте фасад в файл config/app.php
' GraphQL ' => Folklore GraphQL Support Facades GraphQL::class,
3- Опубликуйте файл конфигурации.
$ php artisan vendor:publish --provider= " FolkloreGraphQLServiceProvider "
4- Просмотрите файл конфигурации.
config/graphql.php
1- Загрузите поставщика услуг в bootstrap/app.php
$ app -> register ( Folklore GraphQL LumenServiceProvider::class);
2- Для использования фасада вам необходимо раскомментировать строку $app->withFacades();
в bootstrap/app.php
После раскомментирования этой строки у вас включен фасад GraphQL
$ app -> withFacades ();
3- Опубликуйте файл конфигурации.
$ php artisan graphql:publish
4- Загрузите файл конфигурации в bootstrap/app.php
Важно : эту команду необходимо выполнить до регистрации поставщика услуг.
$ app -> configure ( ' graphql ' );
. . .
$ app -> register ( Folklore GraphQL LumenServiceProvider::class)
5- Просмотрите файл конфигурации.
config/graphql.php
Начиная с версии 1.0, вы можете определить несколько схем. Наличие нескольких схем может быть полезно, если, например, вам нужна общедоступная конечная точка, а другая требует аутентификации.
Вы можете определить несколько схем в конфигурации:
' schema ' => ' default ' ,
' schemas ' => [
' default ' => [
' query ' => [
// 'users' = > 'AppGraphQLQueryUsersQuery'
],
' mutation ' => [
// 'updateUserEmail' = > 'AppGraphQLQueryUpdateUserEmailMutation'
]
],
' secret ' => [
' query ' => [
// 'users' = > 'AppGraphQLQueryUsersQuery'
],
' mutation ' => [
// 'updateUserEmail' = > 'AppGraphQLQueryUpdateUserEmailMutation'
]
]
]
Или вы можете добавить схему, используя фасад:
GraphQL:: addSchema ( ' secret ' , [
' query ' => [
' users ' => ' AppGraphQLQueryUsersQuery '
],
' mutation ' => [
' updateUserEmail ' => ' AppGraphQLQueryUpdateUserEmailMutation '
]
]);
После этого вы можете построить схему, используя фасад:
// 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 App GraphQL Type ;
use GraphQL Type Definition Type ;
use Folklore GraphQL Support Type 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, например, в поставщике услуг.
GraphQL:: addType ( ' AppGraphQLTypeUserType ' , ' User ' );
Затем вам нужно определить запрос, который возвращает этот тип (или список). Вы также можете указать аргументы, которые можно использовать в методе разрешения.
namespace App GraphQL Query ;
use GraphQL ;
use GraphQL Type Definition Type ;
use Folklore GraphQL Support Query ;
use App User ;
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 ();
}
}
}
Добавьте запрос в файл конфигурации config/graphql.php
' schemas ' => [
' default ' => [
' query ' => [
' users ' => ' AppGraphQLQueryUsersQuery '
],
// ...
]
]
И все. У вас должна быть возможность запросить GraphQL с запросом URL-адреса /graphql
(или чего-либо, что вы выберете в своей конфигурации). Попробуйте запрос GET со следующими входными query
query FetchUsers {
users {
id
email
}
}
Например, если вы используете усадьбу:
http://homestead.app/graphql?query=query+FetchUsers{users{id,email}}
Мутация похожа на любой другой запрос: она принимает аргументы (которые будут использоваться для мутации) и возвращает объект определенного типа.
Например мутация для обновления пароля пользователя. Сначала вам нужно определить мутацию.
namespace App GraphQL Mutation ;
use GraphQL ;
use GraphQL Type Definition Type ;
use Folklore GraphQL Support Mutation ;
use App User ;
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
, вы используете аргументы для обновления модели и ее возврата.
Затем вы добавляете мутацию в файл конфигурации config/graphql.php
' schema ' => [
' default ' => [
' mutation ' => [
' updateUserPassword ' => ' AppGraphQLMutationUpdateUserPasswordMutation '
],
// ...
]
]
После этого вы сможете использовать следующий запрос на своей конечной точке для выполнения мутации.
mutation users {
updateUserPassword(id: "1", password: "newpassword") {
id
email
}
}
если вы используете усадьбу:
http://homestead.app/graphql?query=mutation+users{updateUserPassword(id: "1", password: "newpassword"){id,email}}
К мутации можно добавить правила проверки. Он использует Validator
laravel для проверки args
.
При создании мутации вы можете добавить метод для определения применимых правил проверки, выполнив следующие действия:
namespace App GraphQL Mutation ;
use GraphQL ;
use GraphQL Type Definition Type ;
use Folklore GraphQL Support Mutation ;
use App User ;
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.
{
"data" : {
"updateUserEmail" : null
},
"errors" : [
{
"message" : " validation " ,
"locations" : [
{
"line" : 1 ,
"column" : 20
}
],
"validation" : {
"email" : [
" The email is invalid. "
]
}
}
]
}