<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Dieudonne Gwet Bikoun</title>
    <description>The latest articles on DEV Community by Dieudonne Gwet Bikoun (@dieudonnegwet).</description>
    <link>https://dev.to/dieudonnegwet</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1829112%2F2423d8ae-82a5-410e-963c-03a98c0dd19e.jpg</url>
      <title>DEV Community: Dieudonne Gwet Bikoun</title>
      <link>https://dev.to/dieudonnegwet</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dieudonnegwet"/>
    <language>en</language>
    <item>
      <title>Utilisation des Pipelines pour structurer le flux de traitement en Laravel(Partie 2)</title>
      <dc:creator>Dieudonne Gwet Bikoun</dc:creator>
      <pubDate>Tue, 28 Jan 2025 11:16:52 +0000</pubDate>
      <link>https://dev.to/dieudonnegwet/utilisation-des-pipelines-pour-structurer-le-flux-de-traitement-en-laravelpartie-2-53b6</link>
      <guid>https://dev.to/dieudonnegwet/utilisation-des-pipelines-pour-structurer-le-flux-de-traitement-en-laravelpartie-2-53b6</guid>
      <description>&lt;p&gt;Dans la &lt;a href="https://dev.to/dieudonnegwet/utilisation-des-pipelines-pour-structurer-le-flux-de-traitement-en-laravelpartie-1-3a1l"&gt;partie 1&lt;/a&gt;, nous avons exploré les concepts théoriques des &lt;strong&gt;Pipelines&lt;/strong&gt; dans Laravel. Maintenant, passons à la pratique avec une étude de cas concrète : &lt;strong&gt;la création d’un système de modération de contenu pour des articles.&lt;/strong&gt; Ce système devra vérifier plusieurs critères avant de publier un article, comme la détection de spam, le filtrage de mots interdits et la validation du formatage.&lt;/p&gt;




&lt;h2&gt;
  
  
  Étude de Cas : Modération d’Articles
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Objectif&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Nous voulons créer un workflow de modération qui :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Vérifie si le contenu contient du spam.&lt;/li&gt;
&lt;li&gt;Filtre les mots interdits.&lt;/li&gt;
&lt;li&gt;Formate le contenu correctement.&lt;/li&gt;
&lt;li&gt;Publie l’article si tout est valide.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Étape 1 : Créer les Classes pour chaque Étape
&lt;/h2&gt;

&lt;p&gt;Chaque étape du pipeline sera représentée par une classe dédiée. Ces classes doivent implémenter une méthode &lt;code&gt;handle($passable, $next)&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. CheckForSpam : Détection de spam&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;?php

namespace App\Pipelines\Moderation;

class CheckForSpam
{
    public function handle($article, $next)
    {
        if ($this-&amp;gt;isSpam($article-&amp;gt;content)) {
            throw new \Exception("Le contenu est considéré comme du spam.");
        }
        return $next($article);
    }

    private function isSpam($content)
    {
        // Exemple simple : détection de mots-clés de spam
        $spamKeywords = ['viagra', 'casino', 'lottery'];
        foreach ($spamKeywords as $keyword) {
            if (stripos($content, $keyword) !== false) {
                return true;
            }
        }
        return false;
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;2. FilterForbiddenWords : Filtrage de mots interdits&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;?php

namespace App\Pipelines\Moderation;

class FilterForbiddenWords
{
    public function handle($article, $next)
    {
        $article-&amp;gt;content = $this-&amp;gt;filter($article-&amp;gt;content);
        return $next($article);
    }

    private function filter($content)
    {
        $forbiddenWords = ['hate', 'violence', 'drugs'];
        return str_ireplace($forbiddenWords, '****', $content);
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;3. FormatContent : Formatage du contenu&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;?php

namespace App\Pipelines\Moderation;

class FormatContent
{
    public function handle($article, $next)
    {
        $article-&amp;gt;content = $this-&amp;gt;format($article-&amp;gt;content);
        return $next($article);
    }

    private function format($content)
    {
        // Exemple : mettre en majuscule la première lettre de chaque phrase
        return ucfirst(strtolower($content));
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Étape 2 : Créer le Pipeline
&lt;/h2&gt;

&lt;p&gt;Maintenant que nous avons nos classes, nous pouvons les enchaîner dans un pipeline.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;use Illuminate\Pipeline\Pipeline;
use App\Pipelines\Moderation\CheckForSpam;
use App\Pipelines\Moderation\FilterForbiddenWords;
use App\Pipelines\Moderation\FormatContent;

class ArticleModeration
{
    public function moderate($article)
    {
        return app(Pipeline::class)
            -&amp;gt;send($article)
            -&amp;gt;through([
                CheckForSpam::class,
                FilterForbiddenWords::class,
                FormatContent::class,
            ])
            -&amp;gt;then(function ($article) {
                // Si tout est valide, publier l'article
                $article-&amp;gt;status = 'published';
                $article-&amp;gt;save();
                return $article;
            });
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Étape 3 : Utiliser le Pipeline
&lt;/h2&gt;

&lt;p&gt;Voici comment utiliser notre système de modération dans un contrôleur ou une commande :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;use App\Models\Article;
use App\Services\ArticleModeration;

class ArticleController extends Controller
{
    public function publish(ArticleModeration $moderation)
    {
        $article = Article::find(1); // Récupérer l'article à modérer

        try {
            $moderatedArticle = $moderation-&amp;gt;moderate($article);
            return response()-&amp;gt;json(['message' =&amp;gt; 'Article publié !', 'article' =&amp;gt; $moderatedArticle]);
        } catch (\Exception $e) {
            return response()-&amp;gt;json(['error' =&amp;gt; $e-&amp;gt;getMessage()], 400);
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Exemple de Résultat
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Avant la modération&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$article = Article::create([
    'content' =&amp;gt; 'This is a VIAGRA ad with some hate speech.',
    'status' =&amp;gt; 'draft',
]);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Après la modération&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$moderatedArticle = $moderation-&amp;gt;moderate($article);

// Résultat :
// - "VIAGRA" est détecté comme spam : une exception est levée.
// - Si le spam est absent, "hate" est remplacé par "****".
// - Le contenu est formaté : "This is a **** ad with some **** speech."
// - Le statut est passé à "published".
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Avantages de cette Approche
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Modularité&lt;/strong&gt; : Chaque étape est isolée et peut être modifiée indépendamment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Testabilité&lt;/strong&gt; : Chaque classe peut être testée unitairement.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Extensibilité&lt;/strong&gt; : Ajouter une nouvelle étape (ex: vérification de plagiat) est trivial.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lisibilité&lt;/strong&gt; : Le flux de traitement est clair et facile à comprendre.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Avec ce cas pratique, vous avez vu comment les Pipelines peuvent structurer un workflow complexe en étapes simples et réutilisables. Que ce soit pour la modération de contenu, la validation de données ou l’orchestration de workflows métier, les Pipelines sont un outil puissant pour garder votre code propre et maintenable.&lt;/p&gt;




&lt;p&gt;Et vous, avez-vous déjà utilisé les Pipelines pour structurer vos workflows ? Partagez vos retours en commentaire !&lt;br&gt;
&lt;strong&gt;Si cet article vous a aidé, n’hésitez pas à le partager avec votre réseau. 👇&lt;/strong&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Utilisation des Pipelines pour structurer le flux de traitement en Laravel(Partie 1)</title>
      <dc:creator>Dieudonne Gwet Bikoun</dc:creator>
      <pubDate>Tue, 28 Jan 2025 09:48:22 +0000</pubDate>
      <link>https://dev.to/dieudonnegwet/utilisation-des-pipelines-pour-structurer-le-flux-de-traitement-en-laravelpartie-1-3a1l</link>
      <guid>https://dev.to/dieudonnegwet/utilisation-des-pipelines-pour-structurer-le-flux-de-traitement-en-laravelpartie-1-3a1l</guid>
      <description>&lt;p&gt;&lt;strong&gt;Laravel&lt;/strong&gt; regorge de fonctionnalités puissantes et souvent sous-exploitées. Parmi elles, les Pipelines (ou "tuyaux") offrent un moyen élégant de structurer des flux de traitement complexes en les découpant en étapes modulaires. Que vous traitiez des données, gériez des requêtes HTTP ou orchestriez des workflows métier, les Pipelines peuvent simplifier votre code et le rendre plus maintenable. Découvrons ensemble comment les utiliser !&lt;/p&gt;




&lt;h2&gt;
  
  
  Qu'est-ce qu'un Pipeline ?
&lt;/h2&gt;

&lt;p&gt;Un Pipeline est un design pattern qui permet de faire passer un objet (une requête, une donnée, etc.) à travers une série d'étapes de traitement (pipes), chacune ayant une responsabilité unique. Chaque étape peut modifier l'objet ou déclencher une action avant de le transmettre à l'étape suivante.&lt;br&gt;
C’est le même principe que les middleware, mais les Pipelines sont plus flexibles et s’appliquent à des cas d’usage bien plus variés.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pourquoi utiliser les Pipelines ?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Modularité&lt;/strong&gt; : Chaque étape est isolée et réutilisable.&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Lisibilité&lt;/strong&gt; : Le flux de traitement est clairement défini.&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Maintenabilité&lt;/strong&gt; : Ajouter ou retirer une étape est trivial.&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Testabilité&lt;/strong&gt; : Chaque pipe peut être testé unitairement.&lt;/p&gt;


&lt;h2&gt;
  
  
  Exemple Pratique : Modération de contenu
&lt;/h2&gt;

&lt;p&gt;Imaginons que vous deviez implémenter un système de modération de contenu pour des articles. Le flux de traitement doit vérifier successivement :&lt;/p&gt;

&lt;p&gt;Si le contenu contient du spam.&lt;br&gt;
Si des mots interdits sont présents.&lt;br&gt;
Si le formatage est correct.&lt;/p&gt;

&lt;p&gt;Sans Pipeline, vous pourriez écrire :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$article = new Article($content);

// Étape 1 : Vérifier le spam
if ($spamChecker-&amp;gt;isSpam($article)) {
    throw new SpamDetectedException();
}

// Étape 2 : Filtrer les mots interdits
$filteredContent = $wordFilter-&amp;gt;filter($article-&amp;gt;content);
$article-&amp;gt;content = $filteredContent;

// Étape 3 : Formater le contenu
$formattedContent = $formatter-&amp;gt;format($article-&amp;gt;content);
$article-&amp;gt;content = $formattedContent;

$article-&amp;gt;save();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Avec le pipeline, ca devient:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;use Illuminate\Pipeline\Pipeline;

$article = new Article($content);

$processedArticle = app(Pipeline::class)
    -&amp;gt;send($article)
    -&amp;gt;through([
        CheckForSpam::class,
        FilterForbiddenWords::class,
        FormatContent::class,
    ])
    -&amp;gt;then(function ($article) {
        return $article-&amp;gt;save();
    });
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Chaque étape est encapsulée dans une classe dédiée, ce qui rend le code plus clair et scalable.&lt;/p&gt;




&lt;h2&gt;
  
  
  Comment ça marche ?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Structure d'un Pipe&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Chaque pipe doit implémenter une méthode &lt;code&gt;handle($passable, $next)&lt;/code&gt; :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class CheckForSpam {
    public function handle($article, $next) {
        if (SpamChecker::detect($article-&amp;gt;content)) {
            throw new SpamDetectedException();
        }
        return $next($article);
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;$passable&lt;/code&gt; : L'objet transmis dans le pipeline (ici, $article).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;$next&lt;/code&gt; : La closure pour passer à l'étape suivante.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Cas d'Usage Avancés
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Traitement des données en Batch&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$data = collect([...]);

$processedData = app(Pipeline::class)
    -&amp;gt;send($data)
    -&amp;gt;through([
        NormalizeData::class,
        EnrichWithExternalAPI::class,
        ExportToCSV::class,
    ])
    -&amp;gt;thenReturn();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;2. Gestion de workflow metier&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Exemple : Validation d'une commande en plusieurs étapes (stock, paiement, livraison).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;app(Pipeline::class)
    -&amp;gt;send($order)
    -&amp;gt;through([
        ValidateStock::class,
        ProcessPayment::class,
        ScheduleDelivery::class,
    ])
    -&amp;gt;then(function ($order) {
        $order-&amp;gt;markAsCompleted();
    });
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;3. Personnalisation dynamique des étapes&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Vous pouvez ajouter des étapes conditionnellement :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$pipes = [FilterForbiddenWords::class];

if ($user-&amp;gt;isAdmin) {
    $pipes[] = ApplyAdminRules::class;
}

app(Pipeline::class)
    -&amp;gt;send($article)
    -&amp;gt;through($pipes)
    -&amp;gt;then(...);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Bonnes Pratiques
&lt;/h2&gt;

&lt;p&gt;Une responsabilité par pipe : Évitez les classes qui font trop de choses.&lt;/p&gt;

&lt;p&gt;Utilisez des interfaces : Pour standardiser les pipes (ex: interface Pipe { handle(...); }).&lt;/p&gt;

&lt;p&gt;Testez chaque étape : Des unit tests simples pour chaque pipe.&lt;/p&gt;

&lt;p&gt;Documentez le flux : Liste des étapes et leur ordre dans la documentation.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Les Pipelines&lt;/strong&gt; sont un outil puissant pour structurer des flux de traitement complexes tout en gardant un code propre et modulaire. Que ce soit pour de la &lt;strong&gt;modération de contenu&lt;/strong&gt;, des &lt;strong&gt;ETL (Extract-Transform-Load)&lt;/strong&gt; ou des &lt;strong&gt;workflows métier&lt;/strong&gt;, ils apportent une solution élégante et scalable.&lt;br&gt;
Laravel rend leur implémentation triviale grâce à la classe &lt;code&gt;Illuminate\Pipeline\Pipeline&lt;/code&gt; – alors pourquoi ne pas en profiter ? 🚀&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Et vous, avez-vous déjà utilisé les Pipelines dans vos projets ? Partagez vos retours en commentaire !&lt;/strong&gt;&lt;br&gt;
Si cet article vous a aidé, n’hésitez pas à le partager avec votre réseau. 👇&lt;/p&gt;

</description>
      <category>laravel</category>
      <category>pipelines</category>
      <category>codequality</category>
      <category>architecture</category>
    </item>
    <item>
      <title>Utilisation des Higher-Order Messages pour un code plus expressif en Laravel</title>
      <dc:creator>Dieudonne Gwet Bikoun</dc:creator>
      <pubDate>Mon, 27 Jan 2025 11:56:31 +0000</pubDate>
      <link>https://dev.to/dieudonnegwet/utilisation-des-higher-order-messages-pour-un-code-plus-expressif-en-laravel-4j16</link>
      <guid>https://dev.to/dieudonnegwet/utilisation-des-higher-order-messages-pour-un-code-plus-expressif-en-laravel-4j16</guid>
      <description>&lt;p&gt;&lt;strong&gt;Laravel&lt;/strong&gt; est un framework PHP qui ne cesse de surprendre par sa simplicité et sa puissance. Parmi ses nombreuses fonctionnalités, les Higher-Order Messages (messages d'ordre supérieur) sont une petite pépite qui permet d'écrire un code plus expressif et concis. Dans cet article, nous allons explorer ce que sont les Higher-Order Messages et comment les utiliser pour améliorer la lisibilité de votre code.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Qu'est-ce qu'un Higher-Order Message ?&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Un Higher-Order Message&lt;/strong&gt; est une méthode qui permet d'appeler une autre méthode sur chaque élément d'une collection ou sur un objet, sans avoir à écrire de boucles explicites. En d'autres termes, c'est un raccourci syntaxique qui rend votre code plus fluide et plus facile à lire.&lt;/p&gt;

&lt;p&gt;Cette fonctionnalité est particulièrement utile lorsque vous travaillez avec des collections en &lt;strong&gt;Laravel&lt;/strong&gt;, mais elle peut aussi s'appliquer à d'autres contextes.&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;Exemple Classique : Les Collections&lt;/strong&gt;&lt;br&gt;
Prenons un exemple simple. Supposons que vous ayez une collection d'utilisateurs et que vous souhaitiez activer tous les utilisateurs inactifs. Sans Higher-Order Message, vous pourriez écrire :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$users = User::where('active', false)-&amp;gt;get();

foreach ($users as $user) {
    $user-&amp;gt;activate();
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Avec un Higher-Order Message, vous pouvez simplifier ce code en une seule ligne :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$users = User::where('active', false)-&amp;gt;get();

$users-&amp;gt;each-&amp;gt;activate();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ici, each est une méthode de collection, et activate est la méthode que vous souhaitez appeler sur chaque élément de la collection. Le Higher-Order Message permet d'éviter la boucle explicite.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Pourquoi Utiliser les Higher-Order Messages ?&lt;/strong&gt;&lt;br&gt;
Code plus concis : Réduit le nombre de lignes de code et supprime les boucles inutiles.&lt;/p&gt;

&lt;p&gt;Lisibilité améliorée : Le code devient plus expressif et plus facile à comprendre.&lt;/p&gt;

&lt;p&gt;Moins de risques d'erreurs : En évitant les boucles manuelles, vous réduisez les risques d'erreurs de typage ou de logique.&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;Exemples Pratiques&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;1. Appliquer une méthode à chaque élément d'une collection&lt;/strong&gt;&lt;br&gt;
Supposons que vous ayez une collection de commandes et que vous souhaitiez marquer toutes les commandes comme expédiées :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$orders = Order::where('status', 'pending')-&amp;gt;get();

$orders-&amp;gt;each-&amp;gt;markAsShipped();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;2. Filtrer une collection avec une méthode&lt;/strong&gt;&lt;br&gt;
Vous pouvez également utiliser les Higher-Order Messages pour filtrer une collection. Par exemple, filtrer les utilisateurs ayant un email vérifié :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$verifiedUsers = $users-&amp;gt;filter-&amp;gt;hasVerifiedEmail();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Utilisation avec &lt;strong&gt;&lt;em&gt;map&lt;/em&gt;&lt;/strong&gt;
Transformez une collection en appliquant une méthode à chaque élément. Par exemple, récupérez les noms complets de tous les utilisateurs :
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$fullNames = $users-&amp;gt;map-&amp;gt;getFullName();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Cas d'Utilisation Avancés&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;1. Chaînage de méthodes&lt;/strong&gt;&lt;br&gt;
Les Higher-Order Messages peuvent être chaînés avec d'autres méthodes de collection pour des opérations complexes. Par exemple, activez tous les utilisateurs inactifs et renvoyez leurs emails :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$emails = User::where('active', false)-&amp;gt;get()
    -&amp;gt;each-&amp;gt;activate()
    -&amp;gt;pluck('email');
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;2. Utilisation avec des relations Eloquent&lt;/strong&gt;&lt;br&gt;
Vous pouvez également utiliser les Higher-Order Messages avec les relations Eloquent. Par exemple, supposons que chaque utilisateur ait plusieurs posts, et que vous souhaitiez publier tous les posts en attente :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$user-&amp;gt;posts()-&amp;gt;where('status', 'pending')-&amp;gt;get()-&amp;gt;each-&amp;gt;publish();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Limitations&lt;/strong&gt;&lt;br&gt;
Bien que les Higher-Order Messages soient puissants, ils ont quelques limitations :&lt;/p&gt;

&lt;p&gt;Ils ne fonctionnent qu'avec des méthodes qui ne nécessitent pas d'arguments supplémentaires.&lt;/p&gt;

&lt;p&gt;Ils sont principalement utiles pour les opérations simples. Pour des logiques plus complexes, une boucle explicite peut être plus appropriée.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;br&gt;
Les Higher-Order Messages sont une fonctionnalité méconnue mais extrêmement utile de Laravel. Ils permettent d'écrire un code plus expressif, concis et lisible, tout en réduisant les risques d'erreurs. Que vous travailliez avec des collections, des relations Eloquent ou d'autres objets, les Higher-Order Messages peuvent grandement simplifier votre code.&lt;/p&gt;

&lt;p&gt;Alors, la prochaine fois que vous écrivez une boucle, demandez-vous : "Est-ce que je peux utiliser un Higher-Order Message ici ?" 🚀&lt;/p&gt;

&lt;p&gt;Vous avez déjà utilisé les Higher-Order Messages dans vos projets ? Partagez vos expériences et vos cas d'utilisation en commentaire !&lt;/p&gt;

&lt;p&gt;N'oubliez pas de partager cet article avec vos collègues développeurs Laravel pour leur faire découvrir cette astuce pratique. 😊&lt;/p&gt;

</description>
      <category>laravel</category>
      <category>php</category>
      <category>higherordermessages</category>
      <category>codequality</category>
    </item>
    <item>
      <title>Les Macros : Comment Étendre les Fonctionnalités de Laravel</title>
      <dc:creator>Dieudonne Gwet Bikoun</dc:creator>
      <pubDate>Mon, 27 Jan 2025 11:11:37 +0000</pubDate>
      <link>https://dev.to/dieudonnegwet/les-macros-comment-etendre-les-fonctionnalites-de-laravel-2b84</link>
      <guid>https://dev.to/dieudonnegwet/les-macros-comment-etendre-les-fonctionnalites-de-laravel-2b84</guid>
      <description>&lt;p&gt;&lt;strong&gt;Laravel&lt;/strong&gt; est l'un des frameworks PHP les plus populaires, apprécié pour sa simplicité, sa flexibilité et sa richesse en fonctionnalités. Cependant, il arrive parfois que vous ayez besoin d'ajouter des fonctionnalités personnalisées pour répondre à des besoins spécifiques. C'est là que les macros entrent en jeu. Dans cet article, nous allons explorer ce que sont les macros et comment elles peuvent vous aider à étendre les fonctionnalités de Laravel.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Qu'est-ce qu'une Macro en Laravel ?&lt;/strong&gt;&lt;br&gt;
Une macro en Laravel est une méthode qui permet d'ajouter dynamiquement des fonctionnalités à des classes existantes sans avoir à modifier le code source de Laravel lui-même. Cela signifie que vous pouvez étendre les classes de base de Laravel, comme &lt;strong&gt;Collection&lt;/strong&gt;, &lt;strong&gt;Request&lt;/strong&gt;, ou &lt;strong&gt;Response&lt;/strong&gt;, en y ajoutant vos propres méthodes.&lt;/p&gt;

&lt;p&gt;Les macros sont particulièrement utiles lorsque vous souhaitez ajouter des méthodes réutilisables à des classes existantes, sans avoir à créer des sous-classes ou à utiliser des traits.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pourquoi Utiliser les Macros ?&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Flexibilité&lt;/strong&gt; : Les macros vous permettent d'ajouter des fonctionnalités personnalisées à des classes existantes sans modifier le code source de Laravel.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Réutilisabilité&lt;/strong&gt; : Vous pouvez définir une macro une fois et l'utiliser dans tout votre projet.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Maintenabilité&lt;/strong&gt; : En évitant de modifier le code source de Laravel, vous facilitez la mise à jour future de votre application.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Comment Créer une Macro en Laravel ?&lt;/strong&gt;&lt;br&gt;
Créer une macro en Laravel est simple. Voici un exemple pour étendre la classe Collection avec une nouvelle méthode toUpper.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Étape 1 : Définir la Macro&lt;/strong&gt;&lt;br&gt;
Vous pouvez définir une macro dans un Service Provider. Par exemple, dans le AppServiceProvider, vous pouvez ajouter le code suivant dans la méthode boot :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;use Illuminate\Support\Collection;

public function boot()
{
    // Définir une macro pour la classe Collection
    Collection::macro('toUpper', function () {
        return $this-&amp;gt;map(function ($value) {
            return is_string($value) ? strtoupper($value) : $value;
        });
    });
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Étape 2 : Utiliser la Macro&lt;/strong&gt;&lt;br&gt;
Une fois la macro définie, vous pouvez l'utiliser sur n'importe quelle instance de Collection :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$collection = collect(['hello', 'world']);

$upperCollection = $collection-&amp;gt;toUpper();

// Résultat : ['HELLO', 'WORLD']
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Exemples Pratiques de Macros&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;1. Macro pour la Classe Request&lt;/strong&gt;&lt;br&gt;
Supposons que vous souhaitiez ajouter une méthode isAdmin à la classe Request pour vérifier si l'utilisateur actuel est un administrateur :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;use Illuminate\Http\Request;

public function boot()
{
    Request::macro('isAdmin', function () {
        return $this-&amp;gt;user() &amp;amp;&amp;amp; $this-&amp;gt;user()-&amp;gt;is_admin;
    });
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Vous pouvez ensuite utiliser cette macro dans vos contrôleurs :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;if ($request-&amp;gt;isAdmin()) {
    // L'utilisateur est un administrateur
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;2. Macro pour la Classe Response&lt;/strong&gt;&lt;br&gt;
Vous pouvez également étendre la classe Response pour ajouter une méthode jsonSuccess qui renvoie une réponse JSON standardisée :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;use Illuminate\Support\Facades\Response;

public function boot()
{
    Response::macro('jsonSuccess', function ($data = null, $message = 'Success', $status = 200) {
        return response()-&amp;gt;json([
            'success' =&amp;gt; true,
            'message' =&amp;gt; $message,
            'data' =&amp;gt; $data,
        ], $status);
    });
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Utilisation&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;return response()-&amp;gt;jsonSuccess(['user' =&amp;gt; $user], 'User retrieved successfully');
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Bonnes Pratiques pour les Macros&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Documentez vos Macros&lt;/strong&gt; : Assurez-vous de bien documenter les macros que vous créez, surtout si vous travaillez en équipe.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Utilisez les Service Providers&lt;/strong&gt; : Définissez vos macros dans des Service Providers pour garder votre code organisé.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Évitez les Conflits&lt;/strong&gt; : Assurez-vous que le nom de votre macro n'entre pas en conflit avec des méthodes existantes ou futures de Laravel.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;br&gt;
Les macros sont un outil puissant pour étendre les fonctionnalités de Laravel sans avoir à modifier son code source. Elles offrent une grande flexibilité et permettent d'ajouter des méthodes personnalisées à des classes existantes de manière simple et efficace. Que vous souhaitiez ajouter des méthodes utilitaires à Collection, Request, ou Response, les macros sont là pour vous faciliter la vie.&lt;/p&gt;

&lt;p&gt;En utilisant les macros, vous pouvez rendre votre code plus lisible, réutilisable et maintenable. Alors, la prochaine fois que vous aurez besoin d'ajouter une fonctionnalité personnalisée à Laravel, pensez aux macros !&lt;/p&gt;

&lt;p&gt;Vous avez des questions ou des expériences à partager sur l'utilisation des macros en Laravel ? Laissez un commentaire ci-dessous !&lt;/p&gt;

&lt;p&gt;N'oubliez pas de partager cet article avec vos collègues développeurs Laravel pour les aider à découvrir la puissance des macros. 🚀&lt;/p&gt;

</description>
      <category>laravel</category>
      <category>macros</category>
      <category>php</category>
      <category>laraveltips</category>
    </item>
  </channel>
</rss>
