Le trait GraphQLFieldsOptimizer
est conçu spécifiquement pour relever ce défi en améliorant les performances des requêtes GraphQL dans une application Laravel. Il optimise la sélection des champs et des relations en fonction des besoins réels de la requête, s'assurant que seule la data nécessaire est extraite de la base de données.
Intégrez ce trait dans votre projet Laravel en suivant ces étapes :
- Assurez-vous que votre projet utilise Laravel et GraphQL Lighthouse.
- Placez le fichier du trait
GraphQLFieldsOptimizer
dans le répertoireapp/Traits
de votre application Laravel.
Incorporez le trait GraphQLFieldsOptimizer
dans vos modèles Eloquent qui sont utilisés comme types GraphQL. Par exemple, pour un modèle User
:
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use BBSLab\GraphqlFieldsOptimizer\Traits\GraphQLFieldsOptimizer;
class User extends Model
{
use GraphQLFieldsOptimizer;
}
Utilisez la méthode scopeWithGraphQLFields
dans vos resolveurs GraphQL pour optimiser les requêtes :
query {
users {
id
name
posts {
id
title
}
}
}
use App\Models\User;
public function resolveUsers($root, $args, $context, ResolveInfo $resolveInfo)
{
return User::withGraphQLFields($resolveInfo)->get();
}
Personnalisez les clés étrangères pour chaque relation en modifiant la méthode getForeignKeyForRelation
dans vos modèles si nécessaire :
protected function getForeignKeyForRelation(string $relation): string
{
if ($relation === 'posts') {
return 'author_id'; // Clé étrangère personnalisée
}
return parent::getForeignKeyForRelation($relation);
}
La validation des noms de champs est contrôlée par la configuration pour prévenir les injections SQL et autres vulnérabilités.
Activez la validation des noms de champs pour renforcer la sécurité en ajoutant la configuration suivante dans votre fichier config/graphql-fields-optimizer.php
:
return [
'enable_security' => true
];
Pour chaque requête, nous avons simulé 50 utilisateurs effectuant 8791 requêtes chacun pendant une durée de 4 minutes. Les requêtes ont été envoyées à une application locale hébergeant notre serveur GraphQL.
Test | Description | Temps de Réponse Moyen (ms) | Taux de Succès |
---|---|---|---|
Sans le package | Requête GraphQL standard sans utilisation du package | 29.32 | 100% |
Avec le package | Requête GraphQL optimisée avec utilisation du package | 26.88 | 100% |
Pour améliorer les performances de votre application, il est crucial de considérer un ensemble d'éléments qui vont au-delà de l'utilisation de notre package. Voici quelques pratiques recommandées :
Nous pouvons ajouter des index sur les colonnes fréquemment utilisées dans les clauses WHERE ou JOIN pour accélérer la recherche et le tri des données.
L'utilisation de clés étrangères permet d'optimiser les jointures entre les tables, ce qui peut réduire le temps d'exécution des requêtes en évitant les balayages complets de table.
Nous pouvons examiner et ajuster les requêtes SQL pour qu'elles soient plus efficaces, en utilisant des clauses telles que WHERE, GROUP BY, HAVING et ORDER BY de manière appropriée.
Pour les requêtes fréquemment exécutées avec des résultats statiques, nous pouvons utiliser des systèmes de mise en cache tels que Redis ou Memcached pour éviter de réexécuter les mêmes requêtes à chaque fois.
Une conception de base de données bien pensée, avec des relations appropriées et une normalisation adéquate, peut également contribuer à des performances optimales.
En combinant ces pratiques avec l'utilisation de notre package, vous pourrez maximiser les performances de votre application et offrir une expérience utilisateur fluide et réactive.
Le trait GraphQLFieldsOptimizer
offre une solution efficace pour optimiser les requêtes GraphQL en ne chargeant que les données nécessaires, améliorant ainsi significativement les performances de vos applications Laravel. Testez toutes les configurations dans un environnement de développement avant de les déployer en production pour garantir la meilleure expérience utilisateur.