Utilice Facebook GraphQL con Laravel 5 o Lumen. Se basa en la implementación de PHP aquí. Puede encontrar más información sobre GraphQL en la Introducción a GraphQL en el blog de React o puede leer las especificaciones de GraphQL. Este es un trabajo en progreso.
Este paquete es compatible con el modelo Eloquent (o cualquier otra fuente de datos). Vea el ejemplo a continuación.
Se lanza la versión 1.0. Si está actualizando desde una versión anterior, puede marcar Actualizar a 1.0.
1- Requiere el paquete a través de Composer en tu composer.json
.
{
"require" : {
"folklore/graphql" : " ~1.0.0 "
}
}
2- Ejecute Composer para instalar o actualizar el nuevo requisito.
$ composer install
o
$ composer update
1- Publicar el archivo de configuración
$ php artisan vendor:publish --provider= " FolkloreGraphQLServiceProvider "
2- Revisar el archivo de configuración
config/graphql.php
1- Agregue el proveedor de servicios a su archivo config/app.php
Folklore GraphQL ServiceProvider::class,
2- Agrega la fachada a tu archivo config/app.php
' GraphQL ' => Folklore GraphQL Support Facades GraphQL::class,
3- Publicar el archivo de configuración
$ php artisan vendor:publish --provider= " FolkloreGraphQLServiceProvider "
4- Revisa el archivo de configuración
config/graphql.php
1- Cargue el proveedor de servicios en bootstrap/app.php
$ app -> register ( Folklore GraphQL LumenServiceProvider::class);
2- Para usar la fachada hay que descomentar la línea $app->withFacades();
en bootstrap/app.php
Después de descomentar esta línea tienes habilitada la fachada GraphQL
$ app -> withFacades ();
3- Publicar el archivo de configuración
$ php artisan graphql:publish
4- Cargar el archivo de configuración en bootstrap/app.php
Importante : este comando debe ejecutarse antes del registro del proveedor de servicios.
$ app -> configure ( ' graphql ' );
. . .
$ app -> register ( Folklore GraphQL LumenServiceProvider::class)
5- Revisa el archivo de configuración
config/graphql.php
A partir de la versión 1.0, puede definir varios esquemas. Tener varios esquemas puede resultar útil si, por ejemplo, desea un punto final que sea público y otro que necesite autenticación.
Puede definir varios esquemas en la configuración:
' schema ' => ' default ' ,
' schemas ' => [
' default ' => [
' query ' => [
// 'users' = > 'AppGraphQLQueryUsersQuery'
],
' mutation ' => [
// 'updateUserEmail' = > 'AppGraphQLQueryUpdateUserEmailMutation'
]
],
' secret ' => [
' query ' => [
// 'users' = > 'AppGraphQLQueryUsersQuery'
],
' mutation ' => [
// 'updateUserEmail' = > 'AppGraphQLQueryUpdateUserEmailMutation'
]
]
]
O puedes agregar un esquema usando la fachada:
GraphQL:: addSchema ( ' secret ' , [
' query ' => [
' users ' => ' AppGraphQLQueryUsersQuery '
],
' mutation ' => [
' updateUserEmail ' => ' AppGraphQLQueryUpdateUserEmailMutation '
]
]);
Luego, puedes construir el esquema usando la fachada:
// 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'
]
]);
O puede solicitar el punto final para un esquema específico
// 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}}
Primero necesitas crear un tipo.
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 );
}
}
Agregue el tipo al archivo de configuración config/graphql.php
' types ' => [
' User ' => ' AppGraphQLTypeUserType '
]
También puede agregar el tipo con GraphQL
Facade, en un proveedor de servicios, por ejemplo.
GraphQL:: addType ( ' AppGraphQLTypeUserType ' , ' User ' );
Luego necesita definir una consulta que devuelva este tipo (o una lista). También puede especificar argumentos que puede utilizar en el método de resolución.
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 ();
}
}
}
Agregue la consulta al archivo de configuración config/graphql.php
' schemas ' => [
' default ' => [
' query ' => [
' users ' => ' AppGraphQLQueryUsersQuery '
],
// ...
]
]
Y eso es todo. Debería poder consultar GraphQL con una solicitud a la URL /graphql
(o cualquier cosa que elija en su configuración). Pruebe una solicitud GET con la siguiente entrada query
query FetchUsers {
users {
id
email
}
}
Por ejemplo, si usas Homestead:
http://homestead.app/graphql?query=query+FetchUsers{users{id,email}}
Una mutación es como cualquier otra consulta, acepta argumentos (que se usarán para realizar la mutación) y devuelve un objeto de cierto tipo.
Por ejemplo una mutación para actualizar la contraseña de un usuario. Primero necesitas definir la mutación.
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 ;
}
}
Como puede ver en el método resolve
, utiliza los argumentos para actualizar su modelo y devolverlo.
Luego agrega la mutación al archivo de configuración config/graphql.php
' schema ' => [
' default ' => [
' mutation ' => [
' updateUserPassword ' => ' AppGraphQLMutationUpdateUserPasswordMutation '
],
// ...
]
]
Luego debería poder utilizar la siguiente consulta en su punto final para realizar la mutación.
mutation users {
updateUserPassword(id: "1", password: "newpassword") {
id
email
}
}
Si usas Homestead:
http://homestead.app/graphql?query=mutation+users{updateUserPassword(id: "1", password: "newpassword"){id,email}}
Es posible agregar reglas de validación a la mutación. Utiliza el Validator
laravel para realizar la validación de los args
.
Al crear una mutación, puede agregar un método para definir las reglas de validación que se aplican haciendo lo siguiente:
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 ;
}
}
Alternativamente, puede definir reglas con cada argumento.
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 ' ]
]
];
}
// ...
}
Cuando ejecuta una mutación, devolverá los errores de validación. Dado que las especificaciones GraphQL definen un determinado formato para los errores, los mensajes de errores de validación se agregan al objeto de error como un atributo validation
adicional. Para encontrar el error de validación, debe verificar el error con un message
igual a 'validation'
, luego el atributo validation
contendrá los mensajes de error normales devueltos por el validador de Laravel.
{
"data" : {
"updateUserEmail" : null
},
"errors" : [
{
"message" : " validation " ,
"locations" : [
{
"line" : 1 ,
"column" : 20
}
],
"validation" : {
"email" : [
" The email is invalid. "
]
}
}
]
}