Système de navigation centralisé
Système de gestion centralisée des menus de navigation permettant de piloter tous les menus depuis un seul fichier de configuration.
Concept du système
Configuration centralisée
Tous les menus de navigation sont gérés depuis le fichier config/navigations.php.
Cette approche permet de modifier, ajouter ou supprimer des items de menu sans toucher aux templates Blade.
- Fichier unique : Toute la configuration des menus dans
config/navigations.php - Templates dynamiques : Les templates Blade utilisent des boucles pour générer les menus
- Helper dédié :
NavigationHelperpour la logique métier - Conditions flexibles : Support des conditions d'affichage (route, auth, permissions, etc.)
Structure de configuration
Organisation en sections pour chaque zone de navigation.
- primary : Menu principal
- header_dropdown_primary : Dropdown "Fonctionnalités"
- auth_menu : Menu utilisateur
- header_dropdown_secondary : Dropdown "Documentation"
- action_button : Bouton d'action
Conditions d'affichage
Système flexible de conditions pour afficher les items.
always: Toujours afficherroute:home: Sur une routeauth: Si connectéguest: Si non connectépermission:xxx: Selon permissionrole:xxx: Selon rôle
NavigationHelper
Helper PHP pour la logique de navigation.
shouldShow(): Vérifie les conditionsgetUrl(): Génère les URLsgetDashboardUrl(): Dashboard admin/appisSectionActive(): Vérifie si actif
Structure de configuration
Menu Principal (primary)
Menu horizontal avec liens directs. Support des ancres pour navigation sur la même page.
'primary' => [
'active' => true,
'items' => [
'home' => [
'label' => 'Accueil',
'route' => 'home',
'anchor' => '#accueil',
'show_when' => 'always',
],
],
],
Dropdown avec sous-menus
Support des sous-menus imbriqués avec icônes configurables.
'shop' => [
'label' => 'Shop',
'has_submenu' => true,
'icon' => [
'type' => 'fa-solid',
'name' => 'fa-chevron-right',
'size' => 'xs',
'class' => 'opacity-70 transition-transform duration-300',
],
'items' => [
'cart' => [
'label' => 'Panier',
'route' => 'shop.cart',
],
],
],
Menu d'authentification
Gestion séparée pour les utilisateurs connectés et non connectés.
'auth_menu' => [
'active' => true,
'guest' => [
'label' => "S'enregistrer",
'icon' => [
'type' => 'fa-solid',
'name' => 'fa-user',
'size' => 'sm',
],
'items' => [
'login' => [
'label' => 'Se connecter',
'route' => 'login',
],
],
],
'auth' => [
'items' => [
'dashboard' => [
'label' => 'Tableau de bord',
'route_condition' => 'admin_or_all_rights',
'icon' => [
'type' => 'fa-solid',
'name' => 'fa-chart-bar',
],
],
],
],
],
Configuration des icônes
Les icônes utilisent le composant <x-ui.icon /> avec support FontAwesome.
'icon' => [
'type' => 'fa-solid', // Type FontAwesome
'name' => 'fa-user', // Nom de l'icône
'size' => 'sm', // Taille (xs, sm, md, lg, etc.)
'class' => 'opacity-70', // Classes CSS additionnelles
],
Utilisation dans les templates
Chargement de la configuration
@php
use App\Helpers\NavigationHelper;
$primaryNav = config('navigations.primary');
$featuresDropdown = config('navigations.header_dropdown_primary');
@endphp
Boucle sur les items
@foreach($primaryNav['items'] ?? [] as $key => $item)
@if(NavigationHelper::shouldShow($item['show_when'] ?? 'always'))
<a href="{{ NavigationHelper::getUrl($item) }}">
{{ $item['label'] }}
</a>
@endif
@endforeach
Utilisation des icônes
@if(isset($item['icon']))
<x-ui.icon
:type="$item['icon']['type'] ?? 'fa-solid'"
:name="$item['icon']['name']"
:size="$item['icon']['size'] ?? 'sm'"
:class="$item['icon']['class'] ?? ''"
/>
@endif
Méthodes du NavigationHelper
shouldShow(string $condition): bool
Vérifie si un item doit être affiché selon sa condition.
NavigationHelper::shouldShow('route:home');
NavigationHelper::shouldShow('auth');
NavigationHelper::shouldShow('permission:edit-posts');
getUrl(array $item): string
Génère l'URL pour un item de menu. Gère les routes, ancres et URLs directes.
$url = NavigationHelper::getUrl([
'route' => 'home',
'anchor' => '#accueil',
]);
getDashboardUrl(): string
Retourne l'URL du dashboard selon les permissions (admin ou app).
$dashboardUrl = NavigationHelper::getDashboardUrl();
// Retourne 'filament.admin.pages.dashboard' ou 'filament.app.pages.dashboard'
isSectionActive(string $section): bool
Vérifie si une section de menu est active dans la configuration.
if (NavigationHelper::isSectionActive('primary')) {
// Afficher le menu principal
}
Exemples pratiques
Ajouter un nouvel item au menu principal
// Dans config/navigations.php
'primary' => [
'active' => true,
'items' => [
// ... items existants
'nouveau' => [
'label' => 'Nouveau',
'route' => 'nouveau.index',
'show_when' => 'auth', // Afficher seulement si connecté
],
],
],
Ajouter un sous-menu
'header_dropdown_primary' => [
'items' => [
'nouveau_module' => [
'label' => 'Nouveau Module',
'has_submenu' => true,
'icon' => [
'type' => 'fa-solid',
'name' => 'fa-chevron-right',
'size' => 'xs',
],
'items' => [
'liste' => [
'label' => 'Liste',
'route' => 'nouveau-module.index',
],
'creer' => [
'label' => 'Créer',
'route' => 'nouveau-module.create',
],
],
],
],
],
Item avec condition de permission
'admin_panel' => [
'label' => 'Administration',
'route' => 'admin.dashboard',
'show_when' => 'permission:access-admin',
'icon' => [
'type' => 'fa-solid',
'name' => 'fa-shield-halved',
],
],
Fichiers du système
Configuration
config/navigations.php - Configuration centralisée de tous les menus
Helper
app/Helpers/NavigationHelper.php - Logique métier pour la navigation
Templates Desktop
resources/views/layouts/includes/navigation/navigation-desktop.blade.php
Templates Mobile
resources/views/layouts/includes/navigation/navigation-mobile.blade.php
Composant Icon
resources/views/components/ui/icon.blade.php - Composant pour les icônes
Bonnes pratiques
Centraliser la configuration
Toujours modifier les menus via config/navigations.php, jamais directement dans les templates.
Utiliser les conditions
Leverage les conditions show_when pour gérer l'affichage dynamique plutôt que des conditions dans les templates.
Icônes via composant
Utiliser le composant <x-ui.icon /> plutôt que des SVG en dur.
Helper pour la logique
Utiliser NavigationHelper pour toute la logique métier plutôt que de la mettre dans les templates.