Laravel Avancé

Comment gérer efficacement les scopes

Créez une classe de Builder personnalisée avec scopes en Laravel pour un code plus lisible, réutilisable et maintenable.

3 minutes de lecture

Comment créer une classe Builder personnalisée avec des scopes Laravel

Lorsque vous travaillez avec Laravel, il est couramment utile d'ajouter des méthodes scope à vos requêtes afin d'améliorer la lisibilité et la réutilisabilité de votre code. Plutôt que d'inclure ces scopes directement dans chaque modèle, il est préférable de créer une classe dédiée qui étend la classe Builder et d'y définir vos méthodes scope publiques. Vous pouvez ensuite override la méthode newEloquentBuilder dans votre modèle pour lui faire utiliser cette nouvelle classe. Voici la démarche à suivre, étape par étape.

Étape 1 : Concevoir une nouvelle classe qui hérite de Builder

La classe doit hériter de Illuminate\Database\Eloquent\Builder ou Illuminate\Database\Query\Builder selon votre contexte. Pour ajouter des méthodes scope, il suffit d'y définir des méthodes publiques.

Exemple de classe personnalisée

Supposons que vous utilisez un modèle Product et que vous souhaitez y ajouter des scopes tels que available et category. Voici comment créer cette classe étendue :

<?php
namespace App\Builders;

use Illuminate\Database\Eloquent\Builder;

class ProductBuilder extends Builder
{
    public function available(): self
    {
        return $this->where('stock', '>', 0);
    }

    public function category(string $categoryName): self
    {
        return $this->whereHas('category', function ($query) use ($categoryName) {
            $query->where('name', $categoryName);
        });
    }
}

Étape 2 : Override la méthode newEloquentBuilder dans votre modèle

Pour que Laravel utilise cette nouvelle classe pour le modèle concerné, il faut override la méthode newEloquentBuilder dans votre modèle. Cela garantit que toutes vos requêtes sur ce modèle emploieront votre builder personnalisé.

Exemple dans le modèle Product

<?php
namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Builder;
use App\Builders\ProductBuilder;

class Product extends Model
{
    public function newEloquentBuilder(Builder $query): ProductBuilder
    {
        return new ProductBuilder($query);
    }
}

Étape 3 : Utiliser vos scopes dans les requêtes

Une fois cette configuration en place, vous pouvez utiliser vos méthodes scope comme s'il s'agissait de méthodes magiques ou statiques sur le modèle. Par exemple :

$products = Product::available()->category('Electronics')->get();

En étendant la classe Builder, vous organisez clairement vos requêtes customisées tout en conservant une syntaxe fluide, expressive et professionnelle.

Résumé des étapes clés

  • Créer une classe qui hérite de Illuminate\Database\Eloquent\Builder et y définir vos méthodes scope publiques.

  • Remplacer la méthode newEloquentBuilder dans votre modèle pour utiliser cette nouvelle classe.

  • Employer vos scopes comme méthodes sur votre modèle pour un code plus lisible et maintenable.

Bonnes pratiques et recommandations

  • Nommez vos méthodes scope de façon claire et descriptive pour améliorer la compréhension.

  • Organisez vos classes dans un namespace dédié, par exemple App\Builders, afin de favoriser une architecture soignée.

  • Combinez cette approche avec d'autres techniques Laravel comme les macros ou traits pour encore plus de flexibilité.

Adopter cette méthode vous permet d'améliorer la maintenabilité de votre code tout en profitant d'une syntaxe élégante et efficace pour vos requêtes complexes.

Contact

N'hésitez pas à me contacter pour échanger sur vos projets.