Verwenden Sie Facebook GraphQL mit Laravel 5 oder Lumen. Es basiert hier auf der PHP-Implementierung. Weitere Informationen zu GraphQL finden Sie in der GraphQL-Einführung im React-Blog oder Sie können die GraphQL-Spezifikationen lesen. Dies ist eine laufende Arbeit.
Dieses Paket ist mit dem Eloquent-Modell (oder jeder anderen Datenquelle) kompatibel. Siehe das Beispiel unten.
Version 1.0 ist erschienen. Wenn Sie ein Upgrade von einer älteren Version durchführen, können Sie „Upgrade auf 1.0“ aktivieren.
1- Fordern Sie das Paket über Composer in Ihrer composer.json
an.
{
"require" : {
"folklore/graphql" : " ~1.0.0 "
}
}
2- Führen Sie Composer aus, um die neue Anforderung zu installieren oder zu aktualisieren.
$ composer install
oder
$ composer update
1- Veröffentlichen Sie die Konfigurationsdatei
$ php artisan vendor:publish --provider= " FolkloreGraphQLServiceProvider "
2- Überprüfen Sie die Konfigurationsdatei
config/graphql.php
1- Fügen Sie den Dienstanbieter zu Ihrer Datei config/app.php
hinzu
Folklore GraphQL ServiceProvider::class,
2- Fügen Sie die Fassade zu Ihrer config/app.php
Datei hinzu
' GraphQL ' => Folklore GraphQL Support Facades GraphQL::class,
3- Veröffentlichen Sie die Konfigurationsdatei
$ php artisan vendor:publish --provider= " FolkloreGraphQLServiceProvider "
4- Überprüfen Sie die Konfigurationsdatei
config/graphql.php
1- Laden Sie den Dienstanbieter in bootstrap/app.php
$ app -> register ( Folklore GraphQL LumenServiceProvider::class);
2- Um die Fassade zu verwenden, müssen Sie die Zeile $app->withFacades();
in bootstrap/app.php
Nachdem Sie diese Zeile auskommentiert haben, ist die GraphQL
Fassade aktiviert
$ app -> withFacades ();
3- Veröffentlichen Sie die Konfigurationsdatei
$ php artisan graphql:publish
4- Laden Sie die Konfigurationsdatei in bootstrap/app.php
Wichtig : Dieser Befehl muss vor der Registrierung des Dienstanbieters ausgeführt werden
$ app -> configure ( ' graphql ' );
. . .
$ app -> register ( Folklore GraphQL LumenServiceProvider::class)
5- Überprüfen Sie die Konfigurationsdatei
config/graphql.php
Ab Version 1.0 können Sie mehrere Schemata definieren. Mehrere Schemata können nützlich sein, wenn Sie beispielsweise einen öffentlichen Endpunkt und einen anderen, der eine Authentifizierung erfordert, wünschen.
Sie können in der Konfiguration mehrere Schemata definieren:
' schema ' => ' default ' ,
' schemas ' => [
' default ' => [
' query ' => [
// 'users' = > 'AppGraphQLQueryUsersQuery'
],
' mutation ' => [
// 'updateUserEmail' = > 'AppGraphQLQueryUpdateUserEmailMutation'
]
],
' secret ' => [
' query ' => [
// 'users' = > 'AppGraphQLQueryUsersQuery'
],
' mutation ' => [
// 'updateUserEmail' = > 'AppGraphQLQueryUpdateUserEmailMutation'
]
]
]
Oder Sie können ein Schema mithilfe der Fassade hinzufügen:
GraphQL:: addSchema ( ' secret ' , [
' query ' => [
' users ' => ' AppGraphQLQueryUsersQuery '
],
' mutation ' => [
' updateUserEmail ' => ' AppGraphQLQueryUpdateUserEmailMutation '
]
]);
Anschließend können Sie das Schema mithilfe der Fassade erstellen:
// 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'
]
]);
Oder Sie können den Endpunkt für ein bestimmtes Schema anfordern
// 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}}
Zuerst müssen Sie einen Typ erstellen.
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 );
}
}
Fügen Sie den Typ zur Konfigurationsdatei config/graphql.php
hinzu
' types ' => [
' User ' => ' AppGraphQLTypeUserType '
]
Sie können den Typ auch mit der GraphQL
Fassade hinzufügen, beispielsweise bei einem Dienstanbieter.
GraphQL:: addType ( ' AppGraphQLTypeUserType ' , ' User ' );
Dann müssen Sie eine Abfrage definieren, die diesen Typ (oder eine Liste) zurückgibt. Sie können auch Argumente angeben, die Sie in der Auflösungsmethode verwenden können.
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 ();
}
}
}
Fügen Sie die Abfrage zur Konfigurationsdatei config/graphql.php
hinzu
' schemas ' => [
' default ' => [
' query ' => [
' users ' => ' AppGraphQLQueryUsersQuery '
],
// ...
]
]
Und das ist es. Sie sollten in der Lage sein, GraphQL mit einer Anfrage an die URL /graphql
(oder alles, was Sie in Ihrer Konfiguration auswählen) abzufragen. Versuchen Sie es mit einer GET-Anfrage mit der folgenden query
query FetchUsers {
users {
id
email
}
}
Wenn Sie beispielsweise „homestead“ verwenden:
http://homestead.app/graphql?query=query+FetchUsers{users{id,email}}
Eine Mutation ist wie jede andere Abfrage, sie akzeptiert Argumente (die zur Durchführung der Mutation verwendet werden) und gibt ein Objekt eines bestimmten Typs zurück.
Zum Beispiel eine Mutation, um das Passwort eines Benutzers zu aktualisieren. Zuerst müssen Sie die Mutation definieren.
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 ;
}
}
Wie Sie in der resolve
sehen können, verwenden Sie die Argumente, um Ihr Modell zu aktualisieren und zurückzugeben.
Anschließend fügen Sie die Mutation zur Konfigurationsdatei config/graphql.php
hinzu
' schema ' => [
' default ' => [
' mutation ' => [
' updateUserPassword ' => ' AppGraphQLMutationUpdateUserPasswordMutation '
],
// ...
]
]
Sie sollten dann in der Lage sein, die folgende Abfrage auf Ihrem Endpunkt zu verwenden, um die Mutation durchzuführen.
mutation users {
updateUserPassword(id: "1", password: "newpassword") {
id
email
}
}
Wenn Sie Homestead verwenden:
http://homestead.app/graphql?query=mutation+users{updateUserPassword(id: "1", password: "newpassword"){id,email}}
Es ist möglich, der Mutation Validierungsregeln hinzuzufügen. Es verwendet den Laravel- Validator
um eine Validierung anhand der args
durchzuführen.
Beim Erstellen einer Mutation können Sie eine Methode hinzufügen, um die geltenden Validierungsregeln zu definieren, indem Sie wie folgt vorgehen:
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 ;
}
}
Alternativ können Sie Regeln für jedes Argument definieren
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 ' ]
]
];
}
// ...
}
Wenn Sie eine Mutation ausführen, werden Validierungsfehler zurückgegeben. Da die GraphQL-Spezifikationen ein bestimmtes Format für Fehler definieren, werden die Validierungsfehlermeldungen dem Fehlerobjekt als zusätzliches validation
hinzugefügt. Um den Validierungsfehler zu finden, sollten Sie mit einer message
gleich 'validation'
nach dem Fehler suchen. Dann enthält das validation
die normalen Fehlermeldungen, die vom Laravel-Validator zurückgegeben werden.
{
"data" : {
"updateUserEmail" : null
},
"errors" : [
{
"message" : " validation " ,
"locations" : [
{
"line" : 1 ,
"column" : 20
}
],
"validation" : {
"email" : [
" The email is invalid. "
]
}
}
]
}