Utilisez Facebook GraphQL avec Laravel 5 ou Lumen. Il est basé sur l'implémentation PHP ici. Vous pouvez trouver plus d'informations sur GraphQL dans l'introduction à GraphQL sur le blog React ou vous pouvez lire les spécifications GraphQL. Il s'agit d'un travail en cours.
Ce package est compatible avec le modèle Eloquent (ou toute autre source de données). Voir l'exemple ci-dessous.
La version 1.0 est publiée. Si vous effectuez une mise à niveau à partir d'une ancienne version, vous pouvez cocher Mettre à niveau vers la version 1.0.
1- Exiger le package via Composer dans votre composer.json
.
{
"require" : {
"folklore/graphql" : " ~1.0.0 "
}
}
2- Exécutez Composer pour installer ou mettre à jour la nouvelle exigence.
$ composer install
ou
$ composer update
1- Publier le fichier de configuration
$ php artisan vendor:publish --provider= " FolkloreGraphQLServiceProvider "
2- Vérifiez le fichier de configuration
config/graphql.php
1- Ajoutez le fournisseur de services à votre fichier config/app.php
Folklore GraphQL ServiceProvider::class,
2- Ajoutez la façade à votre fichier config/app.php
' GraphQL ' => Folklore GraphQL Support Facades GraphQL::class,
3- Publier le fichier de configuration
$ php artisan vendor:publish --provider= " FolkloreGraphQLServiceProvider "
4- Vérifiez le fichier de configuration
config/graphql.php
1- Chargez le fournisseur de services dans bootstrap/app.php
$ app -> register ( Folklore GraphQL LumenServiceProvider::class);
2- Pour utiliser la façade vous devez décommenter la ligne $app->withFacades();
dans bootstrap/app.php
Après avoir décommenté cette ligne, la façade GraphQL
est activée
$ app -> withFacades ();
3- Publier le fichier de configuration
$ php artisan graphql:publish
4- Charger le fichier de configuration dans bootstrap/app.php
Important : cette commande doit être exécutée avant l'enregistrement du prestataire
$ app -> configure ( ' graphql ' );
. . .
$ app -> register ( Folklore GraphQL LumenServiceProvider::class)
5- Vérifiez le fichier de configuration
config/graphql.php
À partir de la version 1.0, vous pouvez définir plusieurs schémas. Avoir plusieurs schémas peut être utile si, par exemple, vous souhaitez un point de terminaison public et un autre nécessitant une authentification.
Vous pouvez définir plusieurs schémas dans la configuration :
' schema ' => ' default ' ,
' schemas ' => [
' default ' => [
' query ' => [
// 'users' = > 'AppGraphQLQueryUsersQuery'
],
' mutation ' => [
// 'updateUserEmail' = > 'AppGraphQLQueryUpdateUserEmailMutation'
]
],
' secret ' => [
' query ' => [
// 'users' = > 'AppGraphQLQueryUsersQuery'
],
' mutation ' => [
// 'updateUserEmail' = > 'AppGraphQLQueryUpdateUserEmailMutation'
]
]
]
Ou vous pouvez ajouter un schéma en utilisant la façade :
GraphQL:: addSchema ( ' secret ' , [
' query ' => [
' users ' => ' AppGraphQLQueryUsersQuery '
],
' mutation ' => [
' updateUserEmail ' => ' AppGraphQLQueryUpdateUserEmailMutation '
]
]);
Ensuite, vous pouvez construire le schéma en utilisant la façade :
// 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'
]
]);
Ou vous pouvez demander le point de terminaison pour un schéma spécifique
// 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}}
Vous devez d’abord créer un type.
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 );
}
}
Ajoutez le type au fichier de configuration config/graphql.php
' types ' => [
' User ' => ' AppGraphQLTypeUserType '
]
Vous pouvez également ajouter le type avec le GraphQL
Facade, chez un prestataire par exemple.
GraphQL:: addType ( ' AppGraphQLTypeUserType ' , ' User ' );
Ensuite, vous devez définir une requête qui renvoie ce type (ou une liste). Vous pouvez également spécifier des arguments que vous pouvez utiliser dans la méthode de résolution.
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 ();
}
}
}
Ajoutez la requête au fichier de configuration config/graphql.php
' schemas ' => [
' default ' => [
' query ' => [
' users ' => ' AppGraphQLQueryUsersQuery '
],
// ...
]
]
Et c'est tout. Vous devriez pouvoir interroger GraphQL avec une requête à l'url /graphql
(ou tout ce que vous choisissez dans votre configuration). Essayez une requête GET avec l'entrée query
suivante
query FetchUsers {
users {
id
email
}
}
Par exemple, si vous utilisez Homestead :
http://homestead.app/graphql?query=query+FetchUsers{users{id,email}}
Une mutation est comme n'importe quelle autre requête, elle accepte des arguments (qui seront utilisés pour effectuer la mutation) et renvoie un objet d'un certain type.
Par exemple une mutation pour mettre à jour le mot de passe d'un utilisateur. Vous devez d’abord définir la mutation.
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 ;
}
}
Comme vous pouvez le voir dans la méthode resolve
, vous utilisez les arguments pour mettre à jour votre modèle et le renvoyer.
Vous ajoutez ensuite la mutation au fichier de configuration config/graphql.php
' schema ' => [
' default ' => [
' mutation ' => [
' updateUserPassword ' => ' AppGraphQLMutationUpdateUserPasswordMutation '
],
// ...
]
]
Vous devriez alors pouvoir utiliser la requête suivante sur votre point de terminaison pour effectuer la mutation.
mutation users {
updateUserPassword(id: "1", password: "newpassword") {
id
email
}
}
si vous utilisez la propriété :
http://homestead.app/graphql?query=mutation+users{updateUserPassword(id: "1", password: "newpassword"){id,email}}
Il est possible d'ajouter des règles de validation à la mutation. Il utilise le laravel Validator
pour effectuer la validation par rapport aux args
.
Lors de la création d'une mutation, vous pouvez ajouter une méthode pour définir les règles de validation qui s'appliquent en procédant comme suit :
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 ;
}
}
Alternativement, vous pouvez définir des règles avec chaque argument
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 ' ]
]
];
}
// ...
}
Lorsque vous exécutez une mutation, elle renvoie les erreurs de validation. Étant donné que les spécifications GraphQL définissent un certain format pour les erreurs, les messages d'erreur de validation sont ajoutés à l'objet d'erreur en tant qu'attribut validation
supplémentaire. Pour trouver l'erreur de validation, vous devez rechercher l'erreur avec un message
égal à 'validation'
, puis l'attribut validation
contiendra les messages d'erreur normaux renvoyés par le validateur Laravel.
{
"data" : {
"updateUserEmail" : null
},
"errors" : [
{
"message" : " validation " ,
"locations" : [
{
"line" : 1 ,
"column" : 20
}
],
"validation" : {
"email" : [
" The email is invalid. "
]
}
}
]
}