rahpt/ci4-module-nav

Navigation and breadcrumb management system for CodeIgniter 4 modules

Installs: 18

Dependents: 1

Suggesters: 0

Security: 0

Stars: 0

Watchers: 0

Forks: 0

Open Issues: 0

pkg:composer/rahpt/ci4-module-nav

v1.2.2 2026-02-23 11:29 UTC

This package is auto-updated.

Last update: 2026-02-26 01:07:57 UTC


README

Version License PHP

Sistema de navegação e breadcrumbs para módulos CodeIgniter 4. Consolida menus de todos os módulos ativos e gerencia breadcrumbs automaticamente.

📋 Características

  • Menu Consolidado - Agrega menus de todos os módulos ativos
  • Breadcrumbs Automáticos - Sistema de breadcrumbs com helper functions
  • Caching - Cache de menus para melhor performance (1 hora)
  • Auto-Discovery - Descobre menus automaticamente de módulos
  • Flexível - Suporta menus hierárquicos e customizados

🚀 Instalação

composer require rahpt/ci4-module-nav

📖 Uso Básico

Definir Menu no Módulo

// app/Modules/Dashboard/Config/Module.php
class Module extends BaseModule
{
    public function menu(): array
    {
        return [
            [
                'label' => 'Dashboard',
                'url' => 'dashboard',
                'icon' => 'fas fa-tachometer-alt',
                'order' => 1
            ],
            [
                'label' => 'Relatórios',
                'url' => 'dashboard/reports',
                'icon' => 'fas fa-chart-bar',
                'order' => 2,
                'children' => [
                    [
                        'label' => 'Vendas',
                        'url' => 'dashboard/reports/sales'
                    ],
                    [
                        'label' => 'Financeiro',
                        'url' => 'dashboard/reports/financial'
                    ]
                ]
            ]
        ];
    }
}

Exibir Menu na View

<?php
use Rahpt\Ci4ModuleNav\MenuRegistry;

$menus = MenuRegistry::all();
?>

<nav>
    <ul>
        <?php foreach ($menus as $item): ?>
            <li>
                <a href="<?= base_url($item['url']) ?>">
                    <?php if(isset($item['icon'])): ?>
                        <i class="<?= $item['icon'] ?>"></i>
                    <?php endif; ?>
                    <?= $item['label'] ?>
                </a>
                
                <?php if(isset($item['children'])): ?>
                    <ul>
                        <?php foreach ($item['children'] as $child): ?>
                            <li>
                                <a href="<?= base_url($child['url']) ?>">
                                    <?= $child['label'] ?>
                                </a>
                            </li>
                        <?php endforeach; ?>
                    </ul>
                <?php endif; ?>
            </li>
        <?php endforeach; ?>
    </ul>
</nav>

Breadcrumbs

// No Controller
set_breadcrumb('Home', '/');
set_breadcrumb('Dashboard', 'dashboard');
set_breadcrumb('Relatórios'); // Sem URL = item atual

// Na View
<?= render_breadcrumbs() ?>

// Output:
// Home > Dashboard > Relatórios

🎨 Helper Functions

set_breadcrumb()

Adiciona item ao breadcrumb.

set_breadcrumb(string $label, ?string $url = null): void

Exemplos:

set_breadcrumb('Home', '/');
set_breadcrumb('Produtos', 'products');
set_breadcrumb('Editar'); // Página atual

render_breadcrumbs()

Renderiza HTML dos breadcrumbs.

render_breadcrumbs(string $separator = '>'): string

Customizar:

// Com separador customizado
<?= render_breadcrumbs(' / ') ?>
// Home / Dashboard / Relatórios

// Com classes CSS
<?= render_breadcrumbs(' > ', 'breadcrumb-list') ?>

⚡ Performance: Caching

Cache Automático

Menus são automaticamente cacheados por 1 hora.

// Primeira chamada: Busca de todos os módulos
$menus = MenuRegistry::all();

// Próximas chamadas (dentro de 1h): Retorna do cache
$menus = MenuRegistry::all(); // Instantâneo!

Limpar Cache

Quando um módulo é ativado/desativado, o cache é automaticamente limpo.

Manual:

MenuRegistry::clearCache();

🔧 API Reference

MenuRegistry::all()

Retorna array consolidado de todos os menus dos módulos ativos.

$menus = MenuRegistry::all();
// [
//     [
//         'label' => 'Dashboard',  
//         'url' => 'dashboard',
//         'icon' => 'fas fa-tachometer-alt',
//         'order' => 1
//     ],
//     ...
// ]

MenuRegistry::clearCache()

Limpa o cache de menus.

MenuRegistry::clearCache();

📦 Integração com Layouts

AdminLTE Example

<!-- app/Views/layouts/adminlte.php -->
<aside class="main-sidebar sidebar-dark-primary">
    <div class="sidebar">
        <nav class="mt-2">
            <ul class="nav nav-pills nav-sidebar flex-column">
                <?php
                use Rahpt\Ci4ModuleNav\MenuRegistry;
                $menus = MenuRegistry::all();
                
                foreach ($menus as $item):
                ?>
                    <li class="nav-item">
                        <a href="<?= base_url($item['url']) ?>" class="nav-link">
                            <i class="nav-icon <?= $item['icon'] ?? 'fas fa-circle' ?>"></i>
                            <p><?= $item['label'] ?></p>
                        </a>
                    </li>
                <?php endforeach; ?>
            </ul>
        </nav>
    </div>
</aside>

Bootstrap Example

<nav aria-label="breadcrumb">
    <ol class="breadcrumb">
        <?php
        $breadcrumbs = get_breadcrumbs();
        $count = count($breadcrumbs);
        
        foreach ($breadcrumbs as $index => $crumb):
            $isLast = ($index === $count - 1);
        ?>
            <li class="breadcrumb-item <?= $isLast ? 'active' : '' ?>">
                <?php if ($isLast || empty($crumb['url'])): ?>
                    <?= $crumb['label'] ?>
                <?php else: ?>
                    <a href="<?= base_url($crumb['url']) ?>">
                        <?= $crumb['label'] ?>
                    </a>
                <?php endif; ?>
            </li>
        <?php endforeach; ?>
    </ol>
</nav>

🎨 Customização Avançada

Ordenação de Menus

public function menu(): array
{
    return [
        [
            'label' => 'Dashboard',
            'order' => 1  // Primeiro
        ],
        [
            'label' => 'Configurações',
            'order' => 100  // Último
        ]
    ];
}

Menus Condicionais

public function menu(): array
{
    $menus = [
        [
            'label' => 'Dashboard',
            'url' => 'dashboard',
            'icon' => 'fas fa-tachometer-alt'
        ]
    ];
    
    // Adicionar apenas se usuário tem permissão
    if (auth()->user()->can('manage.users')) {
        $menus[] = [
            'label' => 'Usuários',
            'url' => 'users',
            'icon' => 'fas fa-users'
        ];
    }
    
    return $menus;
}

🧪 Testes

composer test

🕒 Histórico de Versões

[1.2.0] - 2026-02-26

  • Bug Fix: Resolvido problema de colisão de cache entre usuários. O cache agora é segmentado por ID de usuário para suportar menus com dados dinâmicos (como UIDs de perfil).
  • Melhoria: Refatoração da chave de cache para maior isolamento de dados entre sessões.

[1.1.0] - 2026-02-16

  • Melhoria: Integrado suporte a Rota Nomeada (Alias) em currentRoute(), tornando os breadcrumbs e menus ativos imunes a mudanças de URL.
  • Performance: Implementação de escuta de eventos (rahpt.module.changed) para limpeza reativa de cache de menus, eliminando verificação manual de status.
  • Arquitetura: Uso do Registrar para carregamento automático de Eventos e Helpers.

[1.0.1] - 2026-02-15

  • Versão inicial estável.

📄 Licença

MIT License

👏 Créditos

Desenvolvido por Rahpt

Versão: 1.2.0
Última Atualização: 2026-02-26