doganddev
Accueil Blog Boutique

Directives Blade personnalisées : @currency, @admin, @hasRole

DOG&DEV · 25/01/2025

Bases de Données Performance Gaming
Directives Blade personnalisées : @currency, @admin, @hasRole

Directives Blade personnalisées : @currency, @admin, @hasRole

Les directives Blade personnalisées permettent d’encapsuler de la logique de présentation (formatage, conditions d’affichage) dans des mots-clés réutilisables. On distingue les directives inline (une expression) et les directives conditionnelles (bloc @directive@enddirective). Ce guide montre comment créer @currency, @admin et @hasRole et les enregistrer dans AppServiceProvider.

Prérequis

  • Projet Laravel avec moteur de vues Blade
  • Accès à app/Providers/AppServiceProvider.php

1. Où enregistrer les directives

Le lieu recommandé est la méthode boot() d’un ServiceProvider, en général AppServiceProvider. Les directives doivent être enregistrées avant le rendu des vues.

// app/Providers/AppServiceProvider.php
use Illuminate\Support\Facades\Blade;

public function boot(): void
{
    // directives ici
}

2. Directive inline : @currency

Une directive inline renvoie une expression PHP qui sera insérée dans la vue.

Enregistrement :

Blade::directive('currency', function ($expression) {
    return "<?php echo number_format($expression, 2); ?>";
});

Utilisation :

<p>Total : @currency($order->total)</p>

Sortie : Total : 1 250,00 (selon la locale de number_format).

3. Directive conditionnelle : @admin … @endadmin

Pour un bloc conditionnel, on utilise Blade::if(). Laravel génère automatiquement le @endadmin.

Enregistrement :

use Illuminate\Support\Facades\Auth;

Blade::if('admin', function () {
    return Auth::check() && Auth::user()->is_admin;
});

Utilisation :

@admin
    <button class="btn btn-danger">Supprimer l’utilisateur</button>
@endadmin

Blade produit : <?php if (Auth::check() && Auth::user()->is_admin): ?> … <?php endif; ?>.

4. Directive avec paramètre : @hasRole(‘manager’)

Blade::if() accepte des arguments passés à la closure :

Blade::if('hasRole', function (string $role) {
    return auth()->check() && auth()->user()->role === $role;
});

Utilisation :

@hasRole('manager')
    <a href="/reports">Voir les rapports</a>
@endhasRole

5. Directive inline avec objet : @datetime

Pour formater un objet Carbon/DateTime :

Blade::directive('datetime', function ($expression) {
    return "<?php echo ($expression)->format('d/m/Y H:i'); ?>";
});
<span>Créé le : @datetime($user->created_at)</span>

6. Bonnes pratiques

  • Rester en présentation : pas de requêtes BDD, pas de logique métier lourde dans les directives.
  • Préférer Blade::if() pour les conditions ; Blade::directive() pour les expressions simples.
  • Nommer de façon claire et cohérente (@admin, @hasRole, @currency).

À éviter

  • Logique métier ou requêtes dans une directive.
  • Blocs trop longs : si la condition devient complexe, mieux vaut la déplacer dans un View Composer, un Composable ou le contrôleur.

Dépannage

Symptôme Cause possible Correctif
@currency($x) affiche la chaîne littérale Directive non enregistrée ou boot() non exécuté Vérifier AppServiceProvider::boot() et composer dump-autoload ; vider le cache de vues
@endadmin inconnu Utilisation de Blade::directive au lieu de Blade::if pour un bloc Pour un bloc conditionnel, utiliser Blade::if('admin', …)
Erreur sur $expression Syntaxe incorrecte dans la vue (guillemets, virgules) Vérifier l’appel : @currency($order->total) et non @currency('$order->total')

Ressources


Cet article s’inscrit dans notre série de guides technique et développement web. Pour un serveur ou une application sur-mesure, contact.

Commentaires (0)

Laisser un commentaire