Directives Blade personnalisées : @currency, @admin, @hasRole
DOG&DEV · 25/01/2025
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
- Tech Verse Daily – Mastering Custom Blade Directives in Laravel
- Documentation Laravel – Blade – Custom Directives
Cet article s’inscrit dans notre série de guides technique et développement web. Pour un serveur ou une application sur-mesure, contact.