Backend

Laravel 10 est là ! Créez des feature flags avec Laravel Pennant

Les feature Flags vous permettent de déployer progressivement de nouvelles fonctionnalités d'application en toute confiance, de faire des tests A/B, et bien plus encore.

3 min de lecture
Laravel 10 est là ! Créez des feature flags avec Laravel Pennant

Laravel Pennant est un package de drapeaux de fonctionnalités (feature flag en anglais) simple et léger développé par l’équipe Laravel et publié lors du déploiement de Laravel 10.

Les feature Flags vous permettent de déployer progressivement de nouvelles fonctionnalités d'application en toute confiance, de faire des tests A/B, et bien plus encore.

Qu'est-ce que les feature flags ? 🤯

Si vous planifiez d'intégrer continuellement des fonctionnalités à votre application lors du développement, vous pouvez envisager d'utiliser des feature flags.

Après tout, il se peut que vous souhaitiez activer/désactiver des fonctionnalités et les masquer.

Vous pourriez également vouloir dévoiler différentes variations de fonctionnalités aux utilisateurs afin de découvrir la plus adaptée. Les feature flags, également appelés « toggles », « bits », « flippers » ou « switches » vous permettent de faire cela et plus encore.

Pendant le développement, les ingénieurs logiciels encapsulent les chemins de code souhaités dans un feature flag. Voici un exemple de feature flag de base fait en utilisant Laravel Pennant

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Laravel\Pennant\Feature;

class PodcastController
{
    public function index(Request $request): Response
    {
        return Feature::for($user)->active('beta-tester')
                ? $this->resolveNewApiResponse($request)
                : $this->resolveLegacyApiResponse($request);
    }
}

Supposons que Devscast veut déployer de nouvelles fonctionnalités dans son api de podcast (je vous recommande d’ailleurs d’écouter nos derniers épisodes).

Vous pouvez vérifier si un utilisateur peut avoir accès à ces fonctionnalités, sinon vous lui donnez l’ancienne.

Et comment définir une fonctionnalité ? 🤔

Pour installer Laravel Pennant, vous allez faire recours au bon vieux composer et pour toute la config RTFD 🙃 (Read The F*cking Documentation), bref, allez ici 👉 https://laravel.com/docs/10.x/pennant

Pour créer une nouvelle fonctionnalité, il suffit de la définir avec votre AppServiceProvider comme suit :

public function boot(): void
{
    Feature::define('beta-tester', fn (User $user) => match (true) {
        $user->isBetaTester() => true,
        default => false,
    });
}

Il s'agit d'un moyen simple et efficace de définir des fonctionnalités dans votre application. Cependant, vous pouvez également utiliser une approche basée sur les classes pour vos fonctionnalités :

class BetaTesters
{
    public function resolve(User $user): mixed
    {
        return match (true) {
            $user->isBetaTester() => true,
            default => false,
        };
    }
}

Pour aller plus loin, nous pourrions même déplacer cette action une couche plus haut dans le middleware pour la rendre plus simple et rediriger l’utilisateur vers la bonne route selon que l'utilisateur est un bêta-testeur ou non.

class VersionMiddleware
{
    public function handle(Request $request, Closure $next): mixed
    {
        if (Feature::active('beta-tester')) {
            return new RedirectResponse(
                uri: "mettre l'url ici",
            );
        }

        return $next($request);
    }
}

Tout peut encore être plus fluide (fluent comme on dit) 😉

Le trait HasFeatures de Pennant peut être ajouté au modèle User de votre application afin de fournir un moyen fluide et pratique de vérifier les fonctionnalités directement à partir du modèle :

<?php

namespace App\Models;

use Illuminate\Foundation\Auth\User as Authenticatable;
use Laravel\Pennant\Concerns\HasFeatures;

class User extends Authenticatable
{
    use HasFeatures;

    // ...
}

Une fois que le trait a été ajouté à votre modèle, vous pouvez facilement vérifier les fonctionnalités en invoquant la méthode features :

if ($user->features()->active('beta-tester')) {
    // ...
}

il y a même des directives Blade 🥵

@feature('beta-tester')
    <!-- design en beta test -->
@else
    <!-- design normal -->
@endfeature

Conclusion

Nous ne saurons évidemment pas tout couvrir dans un seul article, car ce package est tellement riche et seul votre imagination sera la limite.

La version 10 de Laravel est sortie, donc on se retrouve dans le groupe de la communauté pour en parler (si vous n’y êtes pas, regardez la bannière tout en haut du site).