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é : NavigationHelper pour 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 afficher
  • route:home : Sur une route
  • auth : Si connecté
  • guest : Si non connecté
  • permission:xxx : Selon permission
  • role:xxx : Selon rôle

NavigationHelper

Helper PHP pour la logique de navigation.

  • shouldShow() : Vérifie les conditions
  • getUrl() : Génère les URLs
  • getDashboardUrl() : Dashboard admin/app
  • isSectionActive() : 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.

Prendre rendez-vous